DFS 回溯與剪枝 C N皇后問題

2021-10-07 15:46:10 字數 862 閱讀 8573

c - n皇后問題

在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

你的任務是,對於給定的n,求出有多少種合法的放置方法。

input共有若干行,每行乙個正整數n≤10,表示棋盤和皇后的數量;如果n=0,表示結束。output共有若干行,每行乙個正整數,表示對應輸入行的皇后的不同放置數量。sample input

185

0

sample output

1

9210

#include #include #include using namespace std;

int queen[12], q[12]=, n, sum=0;

int check(int n) {

for(int i=0; i(1)打表。在main()中提前算出來從1到10的所有n皇后問題的答案,並儲存在陣列中,等讀取輸入後立刻輸出。如果不打表,而是輸入n後再單獨計算輸出,會超時。

(2)遞迴搜尋dfs()。遞迴程式十分簡潔,把第乙個皇后按行放到棋盤上,然後遞迴放置其他的皇后,直到放完。

(3)回溯判斷check()。判斷新放置的皇后和已經放好的皇后在橫向、縱向、斜對角方向是否衝突。其中,橫向並不需要判斷,因為在遞迴的時候已經是按不同行放置的。

(4)模組化程式設計。例如check()的內容很少,其實可以直接寫在dfs()內部,不用單獨寫成乙個函式。但是單獨寫成函式,把功能模組化,好處很多,例如邏輯清晰,容易差錯等。建議在寫程式的時候盡量把能分開的功能單獨寫成函式,這樣可以大大減少編碼和除錯的時間。

C N皇后問題

c n皇后問題 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。ou...

c n皇后問題

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

hdu2553 N皇后問題 dfs回溯剪枝 打表

problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如...