/*我国古籍记载着 * 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 } }