题目描述
标题:五星填数
如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。
如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。
请提交表示方案数目的整数,不要填写任何其它内容。
简单分析
典型暴力,不过由于太多的数,所以用for不是太好的选择
可以用深度优先dfs
最后/10是由于镜像与旋转的原因,对比那个反幻方,可以看出除的那个数和边的个数有关 /(边的个数*2)
代码奉上
public class e2 {
static int[] data = { 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 };
static int[] res = new int[data.length];
static boolean[] vis = new boolean[data.length];
static int count = 0;
public static void dfs(int n) {
if (n == data.length) {
if (isOk()) {
count++;
}
} else {
for (int i = 0; i < data.length; i++) {
if (vis[i])
continue;
vis[i] = true;
res[n] = data[i];
dfs(n + 1);
vis[i] = false;
}
}
}
// 判断是否符合情况
private static boolean isOk() {
int add[] = new int[5];
add[0] = res[0] + res[2] + res[5] + res[7];
add[1] = res[0] + res[3] + res[6] + res[9];
add[2] = res[1] + res[2] + res[3] + res[4];
add[3] = res[1] + res[5] + res[8] + res[9];
add[4] = res[4] + res[6] + res[8] + res[7];
for (int i = 0; i < add.length - 1; i++) {
for (int j = i + 1; j < add.length; j++) {
if (add[j] != add[i])
return false;
}
}
return true;
}
public static void main(String[] args) {
dfs(0);
System.out.println(count / 10);
}
}
运行结果 :12