遞迴實現N皇后問題

2021-09-12 19:40:23 字數 807 閱讀 5824

因為每行只能放置乙個皇后,故可用一維陣列a儲存 第i行皇后的列數,即 a[i]=j 表示第i行的皇后位於第j列。為方便起見,下標全部從1開始。它可以實時表示擺放的狀態。

遞迴函式 queen(i) 可理解為:我們已經無衝突的擺放好了前(i-1)行的皇后並在陣列a中儲存,現在開始擺放第i行的皇后。對於第i行的擺法,我們遍歷這一行的每一列j,如果位置(i,j)與前(i-1)的皇后都不衝突,則我們認為它是可行的,於是執行a[i]=j,即表示第i行的皇后位置是第j列,賦值完成即表示第i行擺放完成,然後遞迴的呼叫queen(i+1)繼續擺放下一行。遞迴出口為i>n。當某一行的所有列已全部遍歷完成後,就會自動回溯,同時還原陣列a的狀態。

另外,衝突指的是共行、共列或共對角線,因為是判斷位置(i,j)與前i-1行是否衝突,必不可能同行,只需判斷是否共列或共對角線即可,只要發生一次共線,則(i,j)必不可擺放,直接返回fasle,如果對前i-1行均不衝突,則返回true。

#include #include #include using namespace std;

#define maxint 100

int n;

int a[maxint];

bool place(int row,int col){

for(int i=1;i例如,輸入n=6,

則輸出此時所有的可能情況,每一行為一種擺法。每行有n個整數,第i個整數表示第i行的皇后擺放的列號。下標均從1開始。

八皇后 N皇后問題 遞迴實現

八皇后問題,即在乙個棋盤上,每行都可以放置乙個皇后,但每個皇后都不能影響其他皇后的安全,即所有皇后的位置不能在同一直線上 解決問題方法及思想 遞迴 在使用遞迴之前首先要準備好兩個函式實現 1.判斷此時此刻位置是否安全 只需要判斷元素上方,左上方,右上方是否安全,且只要有乙個位置不安全,則結束判斷 2...

n皇后問題 遞迴

遞迴回溯深度優先搜尋解決n皇后問題 用三個陣列b,c,d分別記錄棋盤上的n個列,2n 1個主對角線和2n 1個負對角線的占用情況。用i,j表示皇后所在的行列,同一主對角線上的行列下標的差一樣,若用表示式i j編號,則是 n 1 n 1,所以用表示式i j n對主對角線編號,範圍是1 2n 1 同樣的...

N皇后問題 遞迴

問題 n行n列的棋盤,放n個皇后,問對於給定的n,求出有多少種合法的放置方法。重點 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。否則會發生互相攻擊。思路 1。首先生成map maxn maxn 並對其進行初始化,可以放棋的地方初始化為0 2。每放乙個皇后,這個皇后...