51. N皇后 - LeetCode

51. N皇后

题目链接

dfs

  • 枚举每一行皇后摆放的列
  • 使用boolean类型的数组来标记已摆放皇后所在的列、主对角线、副对角线
  • 主对角线为行+列,副对角线为行-列
class Solution {

    List<List<String>> ans = new ArrayList<>();

    public List<List<String>> solveNQueens(int n) {
        dfs(new int[n], n, 0, new boolean[n], new boolean[2*n-1], new boolean[2*n-1]);
        return ans;
    }

    private void dfs(int[] row, int n, int i, boolean[] column, boolean[] diagonal1, boolean[] diagonal2){
        if(i == n){
            ans.add(print(row, n));
            return;
        }
        for(int j = 0; j < n; j++){
            if(column[j]) continue;
            if(diagonal1[i+j]) continue;
            if(diagonal2[i-j+n-1]) continue;
            column[j] = true;
            diagonal1[i+j] = true;
            diagonal2[i-j+n-1] = true;
            row[i] = j;
            dfs(row, n, i+1, column, diagonal1, diagonal2);
            column[j] = false;
            diagonal1[i+j] = false;
            diagonal2[i-j+n-1] = false;
        }
    }

    private List<String> print(int[] row, int n){
        List<String> list = new ArrayList<>();
        for(int i = 0; i < n; i++){
            char[] s = new char[n];
            Arrays.fill(s, '.');
            s[row[i]] = 'Q';
            list.add(new String(s));
        }
        return list;
    }
}
posted @ 2021-03-09 16:18  一天到晚睡觉的鱼  阅读(33)  评论(0编辑  收藏  举报