N皇后問題 通過DFS方式輸出所有的棋子放置方案

2021-09-12 19:16:04 字數 901 閱讀 4209

n皇后問題是指在n×n格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

思路1.如何判斷(row, col)位置是否能放皇后

(1)使用col儲存已經擺放皇后的列索引

(2)sum儲存 / 方向的對角線,因為 / 方向的對角線的座標滿足 (x1+y1) = (x2+y2),例如  (0+3)=(1+2)=(2+1)=(3+0)

(3)diff儲存 \ 方向的對角線,因為 \ 方向的對角線的座標滿足 (x1-y1) = (x2-y2),例如  (0-0)=(1-1)=(2-2)=(3-3)

2. dfs :遍歷第row行的每一列元素。

(1)如果發現能放皇后,則col、sum、diff都加上當前元素( i )的相關值,然後構造出該行的棋盤。繼續遍歷下一行(row+1),擺放皇后棋。遞迴結束後,當前row行的放置回退一步(col、sum、diff,result 都移除剛剛加入的元素),繼續遍歷下一列的位置( i++ )。

(3)直到row==n,則找到一種棋子放置方案。

(4)如果第row行中所有棋子都不能放,當前的dfs達到i=n時,當前遍歷結束,返回到上一層繼續判斷下一列的位置。

class solution 

void dfs(int row, listresult)

for(int i = 0;iresult.add(tmp);

dfs(row+1,result);

col.remove((integer)i);

sum.remove((integer)(row+i));

diff.remove((integer)(row-i));

result.remove(result.size() - 1);}}

}}

N皇后問題 DFS

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

N皇后問題 dfs)

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

N皇后問題 DFS

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