問題描述:在8*8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處在同一行、同一列或同一斜線上。
解決思路:解決八皇后問題不難,主要是應用到了遞迴回溯的方法,本質上也是一種列舉法。從棋盤的第一行開始嘗試擺放第乙個皇后,擺放成功之後,遞迴一層,再遵循規則在棋盤第二行來擺放第二個皇后。如果當前位置無法擺放,則向右移動一格再次嘗試,如果擺放成功後則繼續遞迴下一層,擺放第三個皇后,以此類推……如果某一層看遍了所有格仔都無法成功擺放,則回溯到上一皇后,讓上一皇后向右移動一格,再進行遞迴。如果八個皇后都擺放完畢且符合規則,那麼就得到了其中一種正確的解法。
具體**如下:
public class eightqueen
}class queen8
if(x+1+i < max && chessboard[x+1+i][y-1-i] == 1)
}return true;
}boolean settle(int y)
//遍歷當前行,逐一格仔檢查
for(int i = 0;i
從八皇后問題引申到2n皇后的問題,也就是藍橋杯歷屆試題中的2n皇后問題,具體問題是:
給定乙個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少種放法?n小於等於8。
輸入格式
輸入的第一行為乙個整數n,表示棋盤的大小。
接下來n行,每行n個0或1的整數,如果乙個整數為1,表示對應的位置可以放皇后,如果乙個整數為0,表示對應的位置不可以放皇后。
輸出格式
輸出乙個整數,表示總共有多少種放法。
樣例輸入 4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出 2
樣例輸入 4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出 0
一樣的思想,只不過2n皇后問題更加的複雜化,所考慮的條件也更加複雜起來。
具體實現**:
#include int go(int* a, int* b, int* c, int m, int n)}}
}return count;
}int main()
八皇后 n皇后 2n皇后
n n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n n 個黑皇后和 n n 個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n n 小於等於 88。輸入的第一行為乙個整數 n n,表示棋盤的大...
從八皇后問題到2n皇后問題
八皇后問題 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 方法 遞迴 回溯 include using namespace std int queen 9 表示每一行皇后的位置,如 queen 2 4,表示第2列第4行有乙個皇...
n皇后與2n皇后問題
題目 在n n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於再n n的棋盤上放置n個皇后,任何2個皇后不妨在同一行或同一列或同一斜線上。給定棋盤的大小n n 13 輸出整數表示有多少種放置方法 n 8是時輸出92 incl...