n皇后問題是將n個皇后放置在n*n的棋盤上,皇后彼此之間不能相互攻擊(任意兩個皇后不能位於同一行,同一列,同一斜線)。
給定乙個整數n,返回所有不同的n皇后問題的解決方案。
每個解決方案包含乙個明確的n皇后放置布局,其中「q」和「.」分別表示乙個女王和乙個空位置。
樣例1:
輸入:1
輸出: [["q"]]
樣例2:
輸入:4
輸出:[
// solution 1
[".q..",
"...q",
"q...",
"..q."
],// solution 2
["..q.",
"q...",
"...q",
".q.."
]]
演算法:dfs(回溯法)題目分析這個問題要求把n個皇后放在乙個nxn的棋盤上,使得任何兩個皇后都不能相互攻擊,即它們不能同行,不能同列,也不能位於同一條對角線上。對於n=1,問題的解很簡單,而且很容易看出對於n=2和n=3來說,這個問題是無解的。所以我們考慮4皇后問題,並用回溯法對它求解。
演算法思路
從空棋盤開始,然後把皇后1 放到它所在行的第-乙個可能位置上,也就是第一-行第一列。對於皇后2,在經過第-列和第二列的失敗嘗試之後,我們把它放在第乙個可能的位置,就是格仔(2, 3),位於第二行第三列的格仔。這被證明是乙個死胡同,因為皇后3將沒有位置可放。所以,該演算法進行回溯,把皇后2放在下乙個可能位置(2,4)上。這樣皇后3就可以放在(3, 2),這被證明是另乙個死胡同。該演算法然後就回溯到底,把皇后1移到(1,2)。 接著皇后2到(2,4), 皇后3到(3,1), 而皇后4到(4, 3), 這就是該問題的乙個解。
**思路
複雜度分析
class solution
search(results, new arraylist(), n);
return results;
}// search函式為搜尋函式,n表示已經放置了n個皇后,cols 表示每個皇后所在的列
private void search(list> results, listcols, int n)
// 列舉當前皇后放置的列,若不合法則跳過
for (int colindex = 0; colindex < n; colindex++)
// 若合法則遞迴列舉下一行的皇后
cols.add(colindex);
search(results, cols, n);
cols.remove(cols.size() - 1);}}
// isvalid函式為合法性判斷函式
private boolean isvalid(listcols, int col)
if (row + col == rowindex + cols.get(rowindex))
if (row - col == rowindex - cols.get(rowindex))
}return true;
}// draw函式為將 cols 陣列轉換為答案的繪製函式
private listdraw(listcols)
result.add(sb.tostring());
}return result;}}
八皇后時間複雜度 九章演算法 N皇后問題
n皇后問題是將n個皇后放置在n n的棋盤上,皇后彼此之間不能相互攻擊 任意兩個皇后不能位於同一行,同一列,同一斜線 給定乙個整數n,返回所有不同的n皇后問題的解決方案。每個解決方案包含乙個明確的n皇后放置布局,其中 q 和 分別表示乙個女王和乙個空位置。樣例1 輸入 1 輸出 q 樣例2 輸入 4 ...
演算法 n皇后問題
題目描述 乙個 n n 的棋盤,要在上面放 n 個皇后。規則 兩個皇后之間如果是同列 同行 同對角線它們會互相攻擊。也就 是 說 棋盤上的任意兩個皇后不能為同列 同行 同對角線。演算法思想 q j 表示乙個解的空間即儲存一組可行解的陣列,j表示行數,q j 的值表示j行可以放置皇后的所在列數,根據任...
(演算法)N皇后問題
八皇后問題 在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。1 回溯法 資料結構 由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣可以定義乙個陣列a 8 陣列中第i個數字,即a i 表示位於第i行的皇后的列...