标题:五星填数
如【图1.png图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。请提交表示方案数目的整数,不要填写任何其它内容。
首先给每个点编号可以得到
所以每条边的和相当于
res[0] + res[2] + res[5] + res[8];
res[0] + res[3] + res[7] + res[9];
res[1] + res[2] + res[3] + res[4];
res[1] + res[5] + res[6] + res[9];
res[8] + res[6] + res[7] + res[4];
然后用dfs让每个点进行全排列,判断每条边是否相等进行筛选
public class Main {
public static int[] res; //用于存储结果
public static boolean[] vis; //用于记录该数在res中是否已排列
public static int total;
public static int count = 0;
public static void main(String[] args) {
total = 10;
res = new int[total];
vis = new boolean[13];
Arrays.fill(vis, true); //未排列时为true
dfs(0);
System.out.println(count);
}
private static void dfs(int i) {
if(i == total) {
int s1 = res[0] + res[2] + res[5] + res[8];
int s2 = res[0] + res[3] + res[7] + res[9];
int s3 = res[1] + res[2] + res[3] + res[4];
int s4 = res[1] + res[5] + res[6] + res[9];
int s5 = res[8] + res[6] + res[7] + res[4];
if(s1 == s2 && s2 == s3 && s3 == s4 && s4 == s5) {
System.out.println(Arrays.toString(res));
count++;
}
}
for(int n = 1; n <= 12; n++) {
if(n != 7 && n != 11 && vis[n]) { //按题目要求,不为7与11,而且还未排列的
res[i] = n;
vis[n] = false;
dfs(i+1);
vis[n] = true;
}
}
}
}