如图所示六角形中,填入1~12的数字。使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
public class DFS1 {
//记录每个位置所填的数
private static int arr[] = new int[13];
//标记每个已经填写的数,已填写为true,反之
private static boolean flag[] = new boolean[13];
//程序开始运行时间
private static long start;
//程序结束运行时间
private static long end;
public static void main(String[] args) {
start = System.currentTimeMillis();
//初始化
arr[1] = 1;
arr[2] = 8;
arr[12] = 3;
flag[1] = true;
flag[8] = true;
flag[3] = true;
dfs(1);
}
//dfs
private static void dfs(int index) {
//默认填写了数值的位置跳过
if (index == 1 || index == 2 || index == 12) {
dfs(index + 1);
}
//填写完所有数值时
if (index == 13) {
print();
}
//填写数字
for (int i = 1 ; i < 13 ; i ++) {
if (flag[i]) {
//i已经填入六边形中,跳过
continue;
}
//将i填入六边形的index位置上
arr[index] = i;
//标记数字i已填写
flag[i] = true;
//填写下一位置
dfs(index + 1);
//下一位置若填写i会导致不满足条件,重新填写并且将数字i标记为未填写
flag[i] = false;
}
}
//打印
private static void print() {
if (check()) {
System.out.println(arr[6]);
end = System.currentTimeMillis();
System.out.println("用时:" + (end - start) + "ms");
System.exit(0);
}
}
//判断六条边的和是否相同
private static boolean check() {
int sum[] = new int[6];
sum[0] = arr[1] + arr[3] + arr[6] + arr[8];
sum[1] = arr[2] + arr[3] + arr[4] + arr[5];
sum[2] = arr[2] + arr[9] + arr[6] + arr[12];
sum[3] = arr[5] + arr[7] + arr[10] + arr[12];
sum[4] = arr[8] + arr[9] + arr[10] + arr[11];
sum[5] = arr[1] + arr[4] + arr[7] + arr[11];
for (int i = 1 ; i < sum.length ; i ++) {
if (sum[i] != sum[i - 1]) {
return false;
}
}
return true;
}
}