5001 n皇后問題

2022-05-22 03:36:13 字數 1380 閱讀 2449

time limit: 10 second

memory limit: 2 mb

在n*n的棋盤上放置n個皇后(西洋棋中的皇后,n≤10)而彼此不受攻擊(即在棋盤的任一行,任一列和任一對角線上不能放置兩個皇后),程式設計求出所有的擺放方法

輸入檔案僅一行,輸入n(0≤n≤10)。

每行輸出一種方案,每種方案按順序輸出皇后所在的列號,各個數之間用空格隔開,若無方案,則輸出「no solution!」。(最後用換行結束)

4
2 4 1 3

3 1 4 2

【題解】

這題的主要問題在於,要如何判斷當前搜素到的位置能不能放下棋子。

這裡用了3個陣列來解決問題。

zxbo,fxbo,bo;

zxbo陣列和fxbo陣列代表①類。

bo陣列代表②類。

用b[i][j],a[i][j]兩個二維陣列儲存每個位置所代表的類。

其中b[i][j] = i - j;a[i][j] = i + j;

如n = 5 得到的b陣列和a陣列如下。

可以看到b陣列從左上到右下的對角線,數字是一樣的。

而a陣列 從右上到左下的對角線,數字也是一樣的。

我們用fxbo,zxbo分別表示負數和正數的b陣列中的數字是否出現過。

用bo陣列表示a陣列中的數字是否出現過。(a陣列不會出現負數)

然後每次放棋子的時候我們只要看看a[i][j]和b[i][j]的值 m,n。然後看看bo[m] 和 fxbo[n]或zxbo[n] 是否為false,如果為false則表示可以放,否則不能放。

放完後把上面的bo,fxbo或 zxbo陣列置為true;

一行一行的搜尋就好,同時還應該加入乙個lbo陣列,用來判斷列的重複情況。

【**】

#include int a[12][12],b[12][12],n,ans[20],nn = 0; //ans 陣列用於記錄答案,nn整形用於判斷答案數,以此來判斷是否輸出無解資訊。

bool zxbo[25],fxbo[25],lbo[12],bo[25];

void init()

void output_ans() //放完所有的棋子,然後輸出答案。

void sear_ch(int x ) //搜尋第x行

for (int i = 1; i <= n;i++) //嘗試每一列

}void s_p()

int main()

N皇后問題

include define maxqueens 20 define minqueens 4 enum bool typedef struct queendata queendata queendata queens maxqueens 1 int ncount init int init chec...

N皇后問題

採用遞迴回溯法 執行結果 輸入8 對於n皇后解的個數,參考 當n 16時,構造法給出解,參考poj 3239 一 當n mod 6 2 且 n mod 6 3時,有乙個解為 2,4,6,8,n,1,3,5,7,n 1 n為偶數 2,4,6,8,n 1,1,3,5,7,n n為奇數 上面序列第i個數為...

N皇后問題

問題 題目 於西洋棋的玩法,因為皇后所在的位置可以縱向 橫向 兩個斜向四個方向的 捕捉 所以8皇后問題就是要求如何布置8個皇后在8 8的棋盤上而使他們互相無法 捕捉 也就是說不存在兩個皇后同行或同列,或在同一斜線上。而n皇后問題就是如何布置n個皇后在n n棋盤裡使不存在兩個皇后在同行同列和同一斜線上...