六角幻方

/*把 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();  
    }

}
原文地址:https://www.cnblogs.com/ljs-666/p/8595616.html