下面的方法能解出九宮格,但對于更高階只有理論可能性,因為耗時太長,不能作為通用解決方案。
輸出:
2 7 6
9 5 1
4 3 8
package com.sitinspring;
public class SquarePuzzle{
/**
* 階數(shù)
*/
private int n;
/**
* 方陣數(shù)組
*/
private Integer[] arr;
/**
* 平均值
*/
private int average;
public SquarePuzzle(int n){
this.n=n;
// 建立數(shù)組并得到平均值
arr=new Integer[n*n];
average=0;
for(int i=1;i<=n*n;i++){
arr[i-1]=i;
average+=i;
}
average=average/n;
// 遞歸查看
permutation(arr,0,arr.length);
}
private void permutation(Integer[] arr,int start,int end){
if(start<end+1){
permutation(arr,start+1,end);
for(int i=start+1;i<end;i++){
Integer temp;
temp=arr[start];
arr[start]=arr[i];
arr[i]=temp;
permutation(arr,start+1,end);
temp=arr[i];
arr[i]=arr[start];
arr[start]=temp;
}
}
else{
/*for(int i=0;i<end;i++){
System.out.print(arr[i]);
}
System.out.print("\n");*/
int i,sum=0;
for(i=0;i<n;i++){
sum+=arr[i];
}
if(sum!=average){
return;
}
// 查看是否縱橫對角線值都相等
checkAndPrint(arr);
}
}
private void checkAndPrint(Integer[] arr){
Integer[][] arr2=new Integer[n][n];
int i,j,sum;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
arr2[i][j]=arr[i*n+j];
}
}
// 橫
for(i=0;i<n;i++){
sum=0;
for(j=0;j<n;j++){
sum+=arr2[i][j];
}
if(sum!=average){
return;
}
}
// 縱
for(i=0;i<n;i++){
sum=0;
for(j=0;j<n;j++){
sum+=arr2[j][i];
}
if(sum!=average){
return;
}
}
// 對角線
sum=0;
for(i=0;i<n;i++){
sum+=arr2[i][i];
}
if(sum!=average){
return;
}
// 對角線
sum=0;
for(i=0;i<n;i++){
sum+=arr2[i][n-i-1];
}
if(sum!=average){
return;
}
// 最終打印
for(i=0;i<n;i++){
for(j=0;j<n;j++){
System.out.print(arr2[i][j]+"\t");;
}
System.out.print("\n");;
}
System.out.print("\n");;
System.exit(0);
}
public static void main(String[] args){
new SquarePuzzle(3);
}
}