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 共...