[遞歸經典題目]八皇后問題

【經典題目】八皇后問題

題目:在2*2的國際象棋上擺放着8個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一個對角線上。下圖所示:圖中有八個皇后,這就是一種符合條件的擺放方法。請問共有多少種符合條件的擺法?


下面是採用遞歸方法來實現的八皇后問題

//8 Queen 遞歸算法 
//如果有一個Q 爲 chess[i]=j; 
//則不安全的地方是 k行 j位置,j+k-i位置,j-k+i位置 

class Queen8 {

	static final int QueenMax = 8;
	static int oktimes = 0;
	static int chess[] = new int[QueenMax];// 每一個Queen的放置位置

	public static void main(String[] args) {
		long time = System.currentTimeMillis();
		for (int i = 0; i < QueenMax; i++)
			chess[i] = -1;
		placequeen(0);
		System.out.println("\n\n\n八皇后共有" + oktimes + "個解法 made by yifi 2003");
		System.out.println((System.currentTimeMillis() - time) + "毫秒");
	}

	public static void placequeen(int num) { // num 爲現在要放置的行數
		int i = 0;
		boolean qsave[] = new boolean[QueenMax];
		for (; i < QueenMax; i++)
			qsave[i] = true;

		// 下面先把安全位數組完成
		i = 0;// i 是現在要檢查的數組值
		while (i < num) {
			qsave[chess[i]] = false;
			int k = num - i;
			if ((chess[i] + k >= 0) && (chess[i] + k < QueenMax))
				qsave[chess[i] + k] = false;
			if ((chess[i] - k >= 0) && (chess[i] - k < QueenMax))
				qsave[chess[i] - k] = false;
			i++;
		}
		// 下面歷遍安全位
		for (i = 0; i < QueenMax; i++) {
			if (qsave[i] == false)
				continue;
			if (num < QueenMax - 1) {
				chess[num] = i;
				placequeen(num + 1);
			} else { // num is last one
				chess[num] = i;
				oktimes++;
				System.out.println("這是第" + oktimes + "個解法 如下:");
				System.out.println("第n行: 1 2 3 4 5 6 7 8");

				for (i = 0; i < QueenMax; i++) {
					String row = "第" + (i + 1) + "行: ";
					if (chess[i] == 0)
						;
					else
						for (int j = 0; j < chess[i]; j++)
							row += "--";
					row += "++";
					int j = chess[i];
					while (j < QueenMax - 1) {
						row += "--";
						j++;
					}
					System.out.println(row);
				}
			}
		}
		// 歷遍完成就停止
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章