/*把 1 2 3 ... 19 共19个整数排列成六角形状,如下: * * * * * * * * * * * * * * * * * * * 要求每个直线上的数字之和必须相等。共有15条直线哦! 再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,参见下图,黄色一行为所求。 请你填写出中间一行的5个数字。数字间用空格分开。 这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)*/ package test; public class 六角幻方 { static int[] table = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; public static void main(String[] args){ int arr[] = new int[16]; boolean[] vis = new boolean[20]; vis[15] = vis[13] = vis[10] = true; //根据初始条件推出第一行的三个数,标记为使用过的 dfs(arr,0,vis); } static void dfs(int[] arr,int step, boolean[] vis){ //arr数组记录从第二行开始的数,step记录当前遍历的步数 if(step == 4){ if(arr[0]+arr[1]+arr[2]+arr[3] != 38) //五层要相等,(1+...+19)/5= 38,注意可判断的点 return ; }else if(step == 5){ if(15+arr[0]+arr[4] != 38) return ; }else if(step == 9){ if(arr[4]+arr[5]+arr[6]+arr[7]+arr[8] != 38 || 10+arr[3]+arr[8] != 38) return ; }else if(step == 10){ if(13+arr[1]+arr[5]+arr[9] != 38) return ; }else if(step == 13){ if(arr[9]+arr[10]+arr[11]+arr[12] != 38 || 13+arr[2]+arr[7]+arr[12] != 38) return ; }else if(step == 14){ if(10+arr[2]+arr[6]+arr[10]+arr[13] != 38 || arr[4]+arr[9]+arr[13] != 38) return ; } else if(step == 15){ if(arr[0]+arr[5]+arr[10]+arr[14] != 38 || arr[3]+arr[7]+arr[11]+arr[14] != 38) return ; } else if(step == 16){ if(arr[13]+arr[14]+arr[15] != 38 || 15+arr[1]+arr[6]+arr[11]+arr[15] != 38 || arr[8]+arr[12]+arr[15] != 38) return ; print(arr); } for(int i = 0; i < table.length; ++i){ if(vis[table[i]] == false){ //如果该数未使用过,则使用arr数组记录下当前使用的数字 vis[table[i]] = true; arr[step] = table[i]; dfs(arr,step+1,vis); vis[table[i]] = false; } } } static void print(int[] arr){ for(int i = 0; i < arr.length; ++i){ System.out.print(arr[i]+" "); } System.out.println(); } }