遞迴演算法 N皇后問題

2021-10-02 08:33:03 字數 1200 閱讀 9317

輸入一正整數n,要求n個西洋棋皇后,擺在n*n的棋盤上,互相不能攻擊,即每個皇后的上下左右和對角線上僅有皇后自身。輸出全部方案。

正整數n

n皇后問題的全部擺法。輸出的結果裡的每一行代表一種擺法。行裡的第i個數字如果是n,就代表第i行的皇后應該放在第n列。皇后的行列號都是從1開始算。

2 4 1 3 

3 1 4 2

問題的分析及解決:

我們通常碰到的都是8皇后問題,如果說皇后數量固定的話,這個問題可以理解為是乙個列舉問題。就拿8舉例,我們可以寫個8重迴圈,第一行,皇后從第乙個格仔開始放,然後第二行皇后從第乙個格仔一直放到第八個格仔,判斷是否符合要求,第三行以此類推,直至8個皇后擺放在棋盤上滿足要求,輸出擺放的情況。

但是這種**的編寫方式存在乙個問題,即便是給出固定的皇后的數值,仍然要寫好多層的巢狀迴圈。如果n的值較大,這**擼起來讓人就有點抓狂了。這個時候就要考慮如何將這麼多的迴圈量減少,那麼遞迴一定是將多層巢狀迴圈簡化的乙個方式。我們會發現,每一層的巢狀迴圈所執行的內容是相同的,那麼只要一層迴圈就可以了,剩下的交給遞迴就可以搞定了。

**思路為:定義乙個函式nqueen(int k)用於遞迴求解,入參k從0開始,即從棋牌的第一行開始放皇后,每一列都嘗試放乙個,完成放置後,呼叫nqueen(1);然後嘗試開始放第二行,第二行的皇后要和第一行的皇后位置進行對比;完成第二行的皇后放置後,呼叫nqueen(2);開始放置第三行皇后,第三行皇后的放置的位置需要與前2行皇后所放置的位置進行對比,完成放置後,呼叫nqueen(3),以此類推。如果發現皇后沒有合適位置放時,且沒有迴圈到第n個皇后,則無法繼續向後呼叫nqueen(k)這個函式,說明遞迴呼叫終止,即該皇后的擺法是不可行的。一直遞迴到nqueen(n)時,輸出當前queenpos的引數值。

有些遞迴演算法題是逆向遞迴的思路,假設n-1的方法已知,去求解n的情形,例如:爬樓梯演算法,漢諾塔演算法等。而這題是從初始值0開始,然後累加1進行遞迴的。這種遞迴的方式可以理解為正向遞迴。具體的實現方式如下所示。

#include #include using namespace std;

int n;

int queenpos[100];//記錄每一橫行中,皇后所放的列位置

void nqueen(int k);

void main()

void nqueen(int k)

else

if (j == k)

}}}

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。每放乙個皇后,這個皇后...

遞迴 n皇后問題

在 n x n 的棋盤上面所有的皇后不能相互攻擊,即所有的皇后 既不在同一行 不在同一列,也不在同一對角線,如下圖所示 以 4 x 4 的棋盤舉例 但是要求求出 n x n 的棋盤上所有排法 n 皇后個數,代表 n x n 的棋盤 第一行 皇后的第一種排法 共 n 個元素,每個元素代表皇后 每行擺放...