五星填数

ps:2015年蓝桥杯国赛Java语言B组第二题


五星填数



如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。

如图就是恰当的填法。

五星填数_第1张图片
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。

请提交表示方案数目的整数,不要填写任何其它内容。


我们可以进行全排列,求出所有的组合,然后找出每条直线上数字和相等的组合。由于每种组合经过旋转和镜像之后都有10种不同的组合满足条件,所以最后还要用组合数/10。


public class Main {
	public static int[] a = { 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 };
	public static int count = 0;

	public static void f(int n) {
		if (n == 10) {
			// 直到得到最后一个数
			if (sum_is_equal()) {
				// 判断和是否相等,相等即输出
				count++;
			}
		}

		for (int i = n; i < 10; i++) {
			// i n 交换
			int temp = a[i];
			a[i] = a[n];
			a[n] = temp;
			// 下一层递归 得到第 n+1 个数
			f(n + 1);
			// 回溯,恢复现场,i++后与n交换,遍历所有情况
			temp = a[i];
			a[i] = a[n];
			a[n] = temp;
		}
	}

	private static boolean sum_is_equal() {
		int temp = a[0] + a[5] + a[6] + a[2];
		if (temp != a[2] + a[7] + a[8] + a[4])
			return false;
		if (temp != a[4] + a[9] + a[5] + a[1])
			return false;
		if (temp != a[1] + a[6] + a[7] + a[3])
			return false;
		if (temp != a[3] + a[8] + a[9] + a[0])
			return false;
		return true;
	}

	public static void main(String[] args) {
		f(0);
		System.out.println(count / 10);
	}

}

答案:12


你可能感兴趣的:(五星填数)