[デイリーブルーブリッジ] 44。2017年の州のJavaグループ「カードトライアングル」の本当の質問

こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです!

私のコラム「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;
		}
		
	}

}

サンプル出力:

欠点や改善点がありますので、友達にメッセージを残して一緒に学んでもらいたいです!

興味のある友達はコラムをフォローできます!

リトルグレイエイプが一緒に進歩するためにあなたに同行します!

 

おすすめ

転載: blog.csdn.net/weixin_44985880/article/details/115266899