こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです!
私のコラム「DailyBlueBridge」に注目してください。このコラムの主な機能は、近年のBlue Bridge Cup州の大会や決勝戦の本当の質問を共有し、アルゴリズムのアイデア、データ構造などを分析することです。その中に存在し、あなたが学ぶのを助けるコンテンツより多くの知識と技術に!
タイトル:ソリティアトライアングル
A、2、3、4、5、6、7、8、9は、正三角形(Aは1で計算されます)の合計9枚のカードに配置されます。各辺の合計は等しい必要があります。
下の図は、ソート方法を示しています(位置合わせに問題がある場合は、p1.pngを参照してください)。
そのような取り決めはたくさんあるかもしれません。
回転とミラーリングの後で同じことを考えると、いくつの異なる配置がありますか?
この数値を計算して提出してください。
注:送信する必要があるのは-整数です。余分なコンテンツは送信しないでください。
問題解決のアイデア:
実際、この質問では、青いブリッジカップのスタイルに応じて、最初に考えるのは1から9までの9つの数字の完全な配置です。その後、配置された順序を判断し、3つの側面を計算します。 。各側の値の合計は、3つの値が等しいかどうかを決定します。配列された配列のどの数字がどちら側にあるかについては、下の図を参照してください。図の数字は、配列の添え字を表しています。
int a1 = arr [0] + arr [1] + arr [3] + arr [5];
int a2 = arr [0] + arr [2] + arr [4] + arr [8];
int a3 = arr [5] + arr [6] + arr [7] + arr [8];
a1、a2、a3が等しいかどうかを判断するだけです
要件を満たすすべての順列を計算した後、注意してください。各面は3回回転でき、ミラーは2回あるため、3 * 2 = 6回繰り返されるため、答えを6で割る必要があります。
回答のソースコード:
public class Year2017_Bt2 { static int [] initArr = {1,2,3,4,5,6,7,8,9}; static int ans = 0; public static void main(String[] args) { f(initArr,0); //由于每一个面可以旋转3次,且有镜面2次,所以会重复3*2=6次,所以答案需要除以6 System.out.println(ans/6); } //对数组元素进行排列 private static void f(int[] arr, int k) { if(k==arr.length) { //计算出每一个面的数值总和 int a1 = arr[0] + arr[1] + arr[3] + arr[5]; int a2 = arr[0] + arr[2] + arr[4] + arr[8]; int a3 = arr[5] + arr[6] + arr[7] + arr[8]; // 如果三个面的数值都相等,则成立 if (a1==a2&&a2==a3) { ans++; } } for (int i = k; i < arr.length; i++) { int t = arr[k]; arr[k] = arr[i]; arr[i] = t; f(arr, k+1); t = arr[k]; arr[k] = arr[i]; arr[i] = t; } } }
サンプル出力:
欠点や改善点がありますので、友達にメッセージを残して一緒に学んでもらいたいです!
興味のある友達はコラムをフォローできます!
リトルグレイエイプが一緒に進歩するためにあなたに同行します!