題目:
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 輸出每行輸出對應一種方案,按字典序輸出所有方案。每種方案順序輸出皇后所在的列號,相鄰兩數之間用空格隔...