天天看點

遞歸方式---求解和為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();
	}
}