1. 程式人生 > >[leetcode] 51. N皇後

[leetcode] 51. N皇後

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皇後