标题:六角幻方
把 1 2 3 ... 19 共19个整数排列成六角形状,如下:
* * *
* * * *
* * * * *
* * * *
* * *
要求每个直线上的数字之和必须相等。共有15条直线哦!
再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见图【p1.png】,黄色一行为所求。
请你填写出中间一行的5个数字。数字间用空格分开。
这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)
这里要注意:有15条线数字之和两两互等,需要测试(1+14)*7次,没有必要只需要例举一些即可。
填空题答案肯定是一种。最后结果一种说明测试的一些组足够判断出答案。
另外dfs要掌握。不理解或者需要交流的同学可以粉我新浪微博@雷锹,私信哟!!!
package jueshai2014;
import java.util.Scanner;
public class _2 {
public static int [] table = {1,2,3,4,5,6,7,8,9,10,11,12,14,16,17,18,19};
public static final int rang = table.length;
public static boolean [] flag = new boolean [rang];
public static int [] array = new int [rang];
public static int n;
public static int count;
public static void Permutation(int k) {
if(k == 5){
if(array[0]+28 != array[1]+array[2]+array[3]+array[4])
return;
}
if(k == 6){
if(array[0]+28 != 15+array[1]+array[5])
return;
}
if(k == 10){
if(array[0]+28 != array[0]+array[4]+array[9])
return;
if(array[0]+28 != array[5]+array[6]+array[7]+array[8]+array[9])
return;
}
if(k == 11){
if(array[0]+28 != 13+array[2]+array[6]+array[10])
return;
}
if(k == 14){
if(array[0]+28 != array[10]+array[11]+array[12]+array[13])
return;
if(array[0]+28 != 13+array[3]+array[8]+array[13])
return;
}
if(k == 17){
if(array[0]+28 != array[14]+array[15]+array[16])return;
if(array[0]+28 != array[5]+array[10]+array[14])return;
if(array[0]+28 != array[9]+array[13]+array[16])return;
if(array[0]+28 != array[0] +array[3]+array[7]+array[11]+array[14])return;
if(array[0]+28 == 13+array[3]+array[8]+array[13]){
System.out.println(array[5]+" "+array[6]+" "+array[7]+" "+array[8]+" "+array[9]);
count++;
return;
}
}
for(int i = 0; i < rang; i++){
if(!flag[i]){
array[k] = table[i];
flag[i] = true;
Permutation(k+1);
flag[i] = false;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(System.currentTimeMillis());
Permutation(0);
System.out.println(count);
System.out.println(System.currentTimeMillis());
}
}