六角填数
程序员文章站
2023-12-23 17:49:33
...
题目描述
如图所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。
代码如下:
对于每一个格子,试探所有可能的数字,直至满足要求
import java.util.*;
public class Main {
static int[] arr = new int[14];
static boolean[] vis = new boolean[14];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
arr[1] = 1;
vis[1] = true;
arr[2] = 8;
vis[8] = true;
arr[12] = 3;
vis[3] = true;
dfs(1);
scan.close();
}
/**
* 递归填数
*
* @param x
* 递归深度
*/
static void dfs(int x) {
// 第一个和第二个格子不填数,直接填下一个格子
if (x == 1 || x == 2) {
dfs(x + 1);
return;
}
// 递归出口
if (x == 12) {
if (check()) {
System.out.println("*=" + arr[6]);
}
}
// 对每一个顶点,试探所有可行的数字
for (int i = 1; i <= 12; i++) {
if (vis[i]) {
continue;
}
vis[i] = true; // 标记该数字,防止重复填入该数
arr[x] = i; // 填数
dfs(x + 1); // 填下一个格子
vis[i] = false; // 恢复该数字,使得其他递归调用时可以使用该数字
}
}
/**
* 检查当前所填数字是否符合题目要求
*
* @return
*/
static boolean check() {
int t[] = new int[6];
t[0] = arr[1] + arr[3] + arr[6] + arr[8];
t[1] = arr[1] + arr[4] + arr[7] + arr[11];
t[2] = arr[2] + arr[3] + arr[4] + arr[5];
t[3] = arr[2] + arr[6] + arr[9] + arr[12];
t[4] = arr[8] + arr[9] + arr[10] + arr[11];
t[5] = arr[12] + arr[10] + arr[7] + arr[5];
for (int i = 1; i < t.length; i++) {
if (t[i] != t[i - 1])
return false;
}
return true;
}
}