天天看点

递归方式---求解和为15的棋盘游戏问题

问题描述:

和为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();
	}
}