LeetCode 51. N皇后 (Java)

LeetCode 51. N皇后 (Java)_第1张图片

冲突示例:

LeetCode 51. N皇后 (Java)_第2张图片

pie(撇)代表 左斜冲突;

na(捺)代表右斜线冲突;

class Solution {

    public  List> solveNQueens(int n) {
        List> colPos = new ArrayList>();//保存每行皇后的列位置
        List col = new ArrayList();
        Set pie = new HashSet();
        Set na = new HashSet();
        DFS(0, colPos, col, pie, na, n);

        List> print = printQueens(colPos, n);
        return print;
    }

    public  void DFS(int row, List> colPos, List col, Set pie, Set na, int n) {
        if (row >= n) {
            List res = new ArrayList(); //深拷贝,因为col是动态变化的,所以结果要先保存起来
            res.addAll(col);
            colPos.add(res);
            return;
        }

        for (int i = 0; i < n; i++) {
            if (col.contains(i) || pie.contains(row + i) || na.contains(row - i)) {//皇后位置冲突
                continue;
            }

            col.add(i);
            pie.add(row + i);
            na.add(row - i);
            DFS(row + 1, colPos, col, pie, na, n);

            col.remove(col.indexOf(i));
            pie.remove(row + i);
            na.remove(row - i);
        }
    }

    public  List> printQueens(List> colPos, int n) {
        List> result = new ArrayList>();
        for (int num = 0; num < colPos.size(); num++) {
            List oneRes = new ArrayList();
            for (int i = 0; i < colPos.get(num).size(); i++) {
                StringBuilder sb = new StringBuilder(); //打印输出
                int j = colPos.get(num).get(i);
                for (int x = 0; x < j; x++) {
                    sb.append(".");
                }
                sb.append("Q");
                for (int x = j + 1; x < n; x++) {
                    sb.append(".");
                }
                String str = sb.toString();
                oneRes.add(str);
            }
            result.add(oneRes);
        }
        return result;
    }
}

 

你可能感兴趣的:(数据结构)