问题描述:
和为15的棋盘游戏要求从1到9的九个数填入3*3的棋盘的方格子中,使得各列、各行以及两条对角线上的三个数之和均为15.
/**
* 递归九层,每层在棋盘的一个格子上放置一个数。
* 用一维数组表示棋盘。
* @author CQcoming
*
*/
/**
* isUsed[i] == 0 表示i+1暂时没有填入棋盘中
* @author CQcoming
*
*/
public class MyTest{
int isUsed[],
qi[],//存储棋盘对应位置存储的数字
count;//用于统计结果数
MyTest(){
isUsed = new int[9];
for(int e:isUsed) e = 0;
qi = new int[9];
for(int e:qi) e = 0;
}
boolean equals15(int num){
if(num == 15)
return true;
else
return false;
}
void dd(int num){ //num记录递归层数
boolean flag = true; //进入第九层时,for循环还会进行九次。确保正确结果只输出一次。
for(int i=0;i<9;i++){
if(num != 9){
if(isUsed[i] == 0){
qi[num] = i+1;
isUsed[i] = 1;
}
else
continue;
dd(num+1);
isUsed[i] = 0; //把数据归位
}
else{
if(flag){
int sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8;
sum1 = qi[0] +qi[1]+qi[2];
sum2 = qi[3] +qi[4]+qi[5];
sum3 = qi[6] +qi[7]+qi[8];//各行
sum4 = qi[0] +qi[3]+qi[6];
sum5 = qi[1] +qi[4]+qi[7];
sum6 = qi[2] +qi[5]+qi[8];//各列
sum7 = qi[0] +qi[4]+qi[8];
sum8 = qi[2] +qi[4]+qi[6];//对角线
if(equals15(sum1) && equals15(sum2) &&equals15(sum3) &&equals15(sum4) &&
equals15(sum5) &&equals15(sum6) &&equals15(sum7) &&equals15(sum8)){
for(int k =0;k<9;k++){
System.out.print(qi[k]+" ");
}
count++;
System.out.println("");
}
}
flag = false;
}
}
}
void printCount(){
System.out.println(count);
}
public static void main(String[] args) {
MyTest a =new MyTest();
a.dd(0);
a.printCount();
}
}