【题目】
如图【1.png】所示六角形中,填入1~12的数字。
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
请通过浏览器提交答案,不要填写多余的内容。
【分析】
我们需要想一个数据结构来存储数据,一般能想到的就是数组了,int[] a由12个元素1~12组成,从上到下从左到右依次编号,然后递归回溯遍历出所有的可能组合。
【源码】
public class Test016 {
public static void main(String[] args) {
int[] a = new int[12];
for(int i=0; i<12; i++){
a[i] = i+1;
}
int[] r = new int[6];
find(a, 0, r);
}
//a是最长数组,k是子数组的first index
private static void find(int[] a, int k, int[] r){
if(k >= 12){
return;
}
for(int i=k; i<a.length; i++){
{
//交换
int temp = a[k];
a[k] = a[i];
a[i] = temp;
}
if(a[0] == 1 && a[1] == 8 && a[11]==3){
r[0] = a[0] + a[2] + a[5] + a[7];
r[1] = a[7] + a[8] + a[9] + a[10];
r[2] = a[10] + a[6] + a[3] + a[0];
r[3] = a[1] + a[5] + a[8] + a[11];
r[4] = a[11] + a[9] + a[6] + a[4];
r[5] = a[4] + a[3] + a[2] + a[1];
if(check(r)){
//找到答案了
System.out.println(a[5]);
return;
}
}
find(a, k+1, r);
{
//回溯
int temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
//检查元素个数为6的数组中的每个元素是否相等
private static boolean check(int[] r){
boolean flag = true;
for(int j=0; j<5; j++){
if(r[j+1] != r[j]){
flag = false;
break;
}
}
return flag;
}
}
【结果】
10
【优化源码2】
public static void main(String[] args) {
int[] a = new int[12];
a[0]=1;
a[1]=8;
a[11]=3;
//先随意给点初值
a[2]=2;
a[3]=4;
a[4]=5;
a[5]=6;
a[6]=7;
a[7]=9;
a[8]=10;
a[9]=11;
a[10]=12;
f(a, 2);
}
private static void f(int[] a, int index) {
if (index == 11) {
yz(a);
return;
}
for (int i = index; i < 11; i++) {
{
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
f(a, index+1);
{
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
}
private static void yz(int[] a) {
int r1 = a[0]+a[2]+a[5]+a[7];
int r2 = a[0]+a[3]+a[6]+a[10];
int r3 = a[1]+a[2]+a[3]+a[4];
int r4 = a[1]+a[5]+a[8]+a[11];
int r5 = a[7]+a[8]+a[9]+a[10];
int r6 = a[4]+a[6]+a[9]+a[11];
if(r1==r2
&&r1==r3
&&r1==r4
&&r1==r5
&&r1==r6) {
//find
System.out.println(a[5]);
System.out.println(Arrays.toString(a));
}
}
【结果】
10
[1, 8, 9, 2, 7, 10, 12, 6, 5, 4, 11, 3]