[leetcode] 51. N皇後
阿新 • • 發佈:2018-07-23
boolean noi 其它 ole else tps arraylist solution 坐標
51. N皇後
啊,經典的N皇後問題。想當初高中練NOIP的時候,這個題把我折磨了好久
經典的dfs+回溯問題
4個約束條件,題中沒有明確指出(並不是所有人都知道國際象棋的規則啊餵):
一個皇後在其橫縱線與兩條斜線上,不能存在其它皇後。
我們來用4個數組來記錄對應的4個約束狀態(其實3個就夠了):
col[] 行
row[] 列
h[] 對角線↖
r[] 對角線↙
那麽其i,j坐標關系可描述為
col[i]
row[j]
h[i+j]
r[i-j + n]
代碼
class Solution { public List<List<String>> solveNQueens(int n) { boolean[] row = new boolean[n]; boolean[] h = new boolean[2 * n]; boolean[] r = new boolean[2 * n]; List<List<String>> ans = new ArrayList<>(); dfs(n, row, h, r, new ArrayList<>(), 0, ans); return ans; } public void dfs(int n, boolean[] row, boolean[] h, boolean[] r, List<Integer> curList, int curK, List<List<String>> ans) { if (curK == n) { List<String> tmp = new ArrayList<>(); for (Integer integer : curList) { String st = ""; for (int i = 0; i < n; i++) { if (i == integer) { st += "Q"; } else { st += "."; } } tmp.add(st); } ans.add(tmp); } for (Integer i = 0; i < n; i++) { if (!row[i] && !h[curK + i] && !r[curK - i + n]) { row[i] = true; h[curK + i] = true; r[curK - i + n] = true; curList.add(i); dfs(n, row, h, r, curList, curK + 1, ans); curList.remove(i); row[i] = false; h[curK + i] = false; r[curK - i + n] = false; } } } }
[leetcode] 51. N皇後