n皇后問題的三個模板

2021-10-19 16:03:46 字數 2221 閱讀 5365

題目:

n-皇后問題是指將 n 個皇后放在 n∗n 的西洋棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。

現在給定整數n,請你輸出所有的滿足條件的棋子擺法。

輸入格式

共一行,包含整數n。

輸出格式

每個解決方案佔n行,每行輸出乙個長度為n的字串,用來表示完整的棋盤狀態。

其中」.」表示某乙個位置的方格狀態為空,」q」表示某乙個位置的方格上擺著皇后。

每個方案輸出完成後,輸出乙個空行。

注意:行末不能有多餘空格。

輸出方案的順序任意,只要不重複且沒有遺漏即可。

資料範圍

1≤n≤9

輸入樣例:

4輸出樣例:

.q……q

q……q.

…q.q…

…q.q…

思路1:

將n個皇后的選取,看成是從所有全排列中的選取。進行全排列並去除不符合要求的。

模板1:

#include

using

namespace std;

const

int n =10;

int n;

bool col[n]

, dg[n]

, udg[n]

;// 列是否滿足條件, 正對角線 副對角線 是否滿足條件

char g[n]

[n];

void

dfs(

int cnt)

for(

int i =

0;i < n;i ++)}

}int

main()

思路2:一行一行的選取,每選取當前行時,判斷前面的行、列、對角線是否會影響當前的列的選取。這個**我個人感覺更好理解,但是沒有第一種簡潔。

模板2:

#include

#include

using

namespace std;

const

int n =10;

int g[n]

[n], h[n]

;// h為 第j行對應的列

int n;

void

dfs(

int cnt)

else

} cout << endl;

} cout << endl;

return;}

cnt ++

;for

(int j =

1;j <= n;j ++)}

if(flag)}}

intmain()

return0;

}

思路3:將nn的棋盤分成nn個元素對待,每個元素對應兩種情況,一種是選,一種是不選。之後再結合條件進行分析。

模板3:

#include

using

namespace std;

const

int n =10;

char g[n]

[n];

int row[n]

, col[n]

, dg[n*2]

, udg[n*2]

;int n;

void

dfs(

int x,

int y,

int s)

return;}

g[x]

[y]=

'.';

dfs(x, y+

1, s);if

(!row[x]

&&!col[y]

&&!dg[x+y]

&&!udg[x-y+n])}

intmain()

總結:做dfs的題,類似n皇后的題 ,就像y總說的那樣,必須腦子裡要有乙個 「順序」 ,有了這個順序之後再結合限制條件,我想一般的dfs肯定不在話下。

Color的三個問題

文 王煜全 什麼是color?新一代網路入口?從網際網路到移動網際網路,交流更為高效 內容愈加豐富 應用日益繁榮,這是本質的趨向。然而,使用者如何進入 access 網路,獲得並使用各種應用,這將成為關鍵問題。也就是說,網路應用入口會是在什麼地方?最初,yahoo式的瀏覽導航是入口 後來,以goog...

三個水杯問題

給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入 第一行乙個整數n 0v2 v3 v1 100 v3 0 表示三個水杯的體積。第二行給...

n皇后 問題(原始的8皇后問題)dfs

題目描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。輸入乙個整數n 1 n 10 輸出每行輸出對應一種方案,按字典序輸出所有方案。每種方案順序輸出皇后所在的列號,相鄰兩數之間用空格隔...