皇后問題:
由n*n個方塊排成n行n列的正方形稱為「n元棋盤」。如果兩個皇后位於棋盤上的同一行或同一列或同一對角線上,則稱她們為互相攻擊,現要求找使n元棋盤上的n個皇后互不攻擊的所有布局。
假設棋盤上每一行放置乙個皇后,分別用自然數0,1,2,.......,n-1。
首先定義乙個長度為n的一維陣列q,其中每乙個元素去q[i](i=0,1,2,.......,n-1),隨時記錄第i行皇后所在的列數。
初始時,先將各皇后放在各行的第0列。即陣列q的初值為:q[i]=0, i=0,1,2,.......,n-1
另外第i行與第j行上的皇后在某一對角線上的條件為去|q[i]-q[j]|=|i-j|;而它們在同一列的條件為q[i]=q[j];
回溯法演算法步驟如下:
對於第i行的皇后,假設前i-1個皇后互相不攻擊,現在來安排第i個皇后使它與前面n-1個皇后互相不攻擊就可以了。
q[i]=n時,表示最後一列也搜尋結束,無法安排第i行的皇后,令q[i]=0,回退一行,考慮重新安排第i-1行的皇后,使第i-1行的皇后向右搜尋q[i-1]=q[i-1]+1;找到使第i-1行與前i-2行互不攻擊的下乙個位置,如果退回到第-1行(實際沒有這一行),表示搜尋結束,退出。
【2】當q[i],由於初始q[i]=0;從第0列開始向右搜尋,,需要檢查第i行上的皇后與前面的從第0行到第i-1均不互相攻擊,才算成立,可以考慮下一行的皇后即i=i+1;若不成立,q[i]=q[i]+1,重複前面的步驟。
【3】若安排好了第n-1行的皇后,說明搜尋到了乙個n皇后互不攻擊的布局,可將其儲存輸出。然後將第n-1行皇后向後移動,即q[n-1]=q[n-1]+1,重複上述步驟,搜尋乙個皇后布局。
具體實現**
#include "iostream"
#include using namespace std;
bool place(int k,int*q)//考察皇后k放置在x[k]列是否發生衝突
{ int i;
for(i=0;i=0)
{ while(q[k]>n;
int* q=new int[n];
for(int i=0;i
回溯法求解N皇后問題。
n皇后問題就是 不存在兩個皇后同行或同列,或在同一斜線上。如下圖所示。黑色塊表示其中乙個皇后放在了第二行,第三列。這時,只有綠色圈圈才能放其他的皇后。回溯法的基本思想 確定了解空間的組織結構後,回溯法就從開始結點 根結點 出發,以深度優先的方式搜尋整個解空間。這個開始結點就成為乙個活結點,同時也成為...
回溯法求解N皇后問題
原始出處 作者資訊和本宣告。否則將追究法律責任。回溯法 也稱為試探法,它並不考慮問題規模的大小,而是從問題的最明顯的最小規模開始逐步求解出可能的答案,並以此慢慢地擴大問題規模,迭代地逼近最終問題的解。這種迭代類似於窮舉並且是試探性的,因為當目前的可能答案被測試出不可能可以獲得最終解時,則撤銷當前的這...
使用回溯法求解N皇后問題
經典的n皇后問題描述為 在乙個n x n的棋盤上放置n個皇后,要求任意的兩個皇后都不在同一行 同一列或同一條對角線上,問在給定n的情況下有多少種放置的方法。求解n皇后最典型的方法是回溯法,此方法的思路可以概括為 在第一行佔據乙個位置,接著在下一行佔據乙個位置,判斷兩個位置之間是否存在衝突。如果不存在...