【問題描述】在n*n的方格棋盤放置n個皇后,要求每個皇后不同行,不同列、不同左右對角線。
【問題求解】採用整數陣列q[n]存放n皇后問題的求解結果,因為每行只能放乙個皇后,q[i](1<=i<=n)的值表示第i個皇后所在的列號,即該皇后放在(i,q[i])的位置上。(為了簡便,不使用q[0]元素)。
對於(i,j)位置上的皇后,是否與已放好的皇后(k,q[k])(1<=k<=i-1)有衝突呢?顯然它們不同列,若同列則有q[k]==j;對角線有兩條,若它們在任一條對角線上,則構成乙個等腰直角三角形,即|q[k]-j|==|i-k|。所以,只要滿足以下條件則存在衝突,否則不衝突;
q[k]==j || abs(q[k]-j)==abs(i-k)
注意:abs()函式為求絕對值函式。
對應的輸出n皇后問題所有解的完整程式如下:
#include #include #include #define n 20 //最多皇后個數
using namespace std;
int q[n]; //存放各皇后所在的列號,即(i,q[i])為乙個皇后位置
int num = 0; //累計解個數
void dispasolution(int n)
else
} }}int main()
else
system("pause");
return 0;
}
輸出為:
皇后問題(n<20)n=
6皇后問題求解如下:
第1個解:(1,2)(2,4)(3,6)(4,1)(5,3)(6,5)
第2個解:(1,3)(2,6)(3,2)(4,5)(5,1)(6,4)
第3個解:(1,4)(2,1)(3,5)(4,2)(5,6)(6,3)
第4個解:(1,5)(2,3)(3,1)(4,6)(5,4)(6,2)
請按任意鍵繼續. . .
遞迴演算法 N皇后問題
輸入一正整數n,要求n個西洋棋皇后,擺在n n的棋盤上,互相不能攻擊,即每個皇后的上下左右和對角線上僅有皇后自身。輸出全部方案。正整數n n皇后問題的全部擺法。輸出的結果裡的每一行代表一種擺法。行裡的第i個數字如果是n,就代表第i行的皇后應該放在第n列。皇后的行列號都是從1開始算。2 4 1 3 3...
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皇后問題 include include include using namespace std void queen int row int c 遞迴回溯本體 int is true int row int c 判斷是否當前旗子擺放符合條件 int n total 0 int ...