反幻方

/*我国古籍记载着
 * 294
 * 753
 * 618
 * 这是一个三阶幻方。每行每列以及对角线上的数字相加都相等
 * 考虑一个相反问题
 * 用1-9的数字填入九宫格使得每行每列对角线上数字和都不相等,搜索所有的三阶反幻方并统计一共有多少种,旋转或镜像算一种*/
package test;

public class 反幻方 {
    static int count=0;
    static void swap(char[] s,int a,int b){
        char temp=s[a];
        s[a]=s[b];
        s[b]=temp;
    }
    public static void dsf(char[] arr,int k,int length){//用k记录当前遍历到的数字位数
        if(k==length){//若填入九宫格使得每行每列对角线上数字和都不相等,则count++;
            if(arr[0]+arr[1]+arr[2]!=arr[3]+arr[4]+arr[5]&&arr[0]+arr[1]+arr[2]!=arr[6]+arr[7]+arr[8]&&arr[0]+arr[1]+arr[2]!=arr[3]+arr[0]+arr[6]&&arr[0]+arr[1]+arr[2]!=arr[1]+arr[4]+arr[7]&&arr[0]+arr[1]+arr[2]!=arr[5]+arr[2]+arr[8]&&arr[0]+arr[1]+arr[2]!=arr[0]+arr[4]+arr[8]&&arr[0]+arr[1]+arr[2]!=arr[2]+arr[4]+arr[6])  
                if(arr[3]+arr[4]+arr[5]!=arr[6]+arr[7]+arr[8]&&arr[3]+arr[4]+arr[5]!=arr[0]+arr[3]+arr[6]&&arr[3]+arr[4]+arr[5]!=arr[1]+arr[4]+arr[7]&&arr[3]+arr[4]+arr[5]!=arr[2]+arr[8]+arr[5]&&arr[3]+arr[4]+arr[5]!=arr[0]+arr[4]+arr[8]&&arr[3]+arr[4]+arr[5]!=arr[2]+arr[4]+arr[6])  
                    if(arr[6]+arr[7]+arr[8]!=arr[0]+arr[3]+arr[6]&&arr[6]+arr[7]+arr[8]!=arr[1]+arr[4]+arr[7]&&arr[6]+arr[7]+arr[8]!=arr[2]+arr[8]+arr[5]&&arr[6]+arr[7]+arr[8]!=arr[0]+arr[4]+arr[8]&&arr[6]+arr[7]+arr[8]!=arr[2]+arr[4]+arr[6])  
                        if(arr[0]+arr[3]+arr[6]!=arr[1]+arr[4]+arr[7]&&arr[0]+arr[3]+arr[6]!=arr[2]+arr[8]+arr[5]&&arr[0]+arr[3]+arr[6]!=arr[0]+arr[4]+arr[8]&&arr[0]+arr[3]+arr[6]!=arr[2]+arr[4]+arr[6])  
                            if(arr[1]+arr[4]+arr[7]!=arr[2]+arr[8]+arr[5]&&arr[1]+arr[4]+arr[7]!=arr[0]+arr[4]+arr[8]&&arr[1]+arr[4]+arr[7]!=arr[2]+arr[4]+arr[6])  
                                if(arr[2]+arr[5]+arr[8]!=arr[0]+arr[4]+arr[8]&&arr[2]+arr[5]+arr[8]!=arr[2]+arr[4]+arr[6])  
                                    if(arr[0]+arr[4]+arr[8]!=arr[2]+arr[4]+arr[6])  
                                        count++;
            return;
        }
        for(int i=k;i<=length;i++){//每次递归从当前位数向后递归
            swap(arr,i,k);
            dsf(arr,k+1,length);
            swap(arr,i,k);
            
        }
    }
    public static void main(String arg[]){
        char[] arr="123456789".toCharArray();
        dsf(arr,0,8);//使用数组来表示九宫格,搜索范围从0-8共9个数
        System.out.print(count/8);//除去旋转(4)和镜像(2),2*4=8
    }

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