• LeetCode No51. N 皇后


    题目

    n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

    每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

    示例 1:

    输入:n = 4
    输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
    解释:如上图所示,4 皇后问题存在两个不同的解法。

    示例 2:

    输入:n = 1
    输出:[["Q"]]

    提示:

    1 <= n <= 9

    思路

    回溯算法的经典题目了。

    AC代码

    点击查看代码
    class Solution {
        List<List<String>> res;
        int[] queens;
        Set<Integer> cols;
        Set<Integer> leftLine;
        Set<Integer> rigthLine;
    
        private List<String> drawGrid(int[] queens, int n) {
            List<String> grid = new ArrayList<String>();
            for (int i = 0; i < n; i++) {
                char[] row = new char[n];
                Arrays.fill(row, '.');
                row[queens[i]] = 'Q';
                grid.add(new String(row));
            }
            return grid;
        }
    
        private void DFS(int row, int n) {
            if( row == n ) {
                List<String> list = drawGrid(queens, n);
                res.add(list);
                return ;
            }
            for(int i=0; i<n; i++) {
                if( cols.contains(i) ) {
                    continue;
                }
                int left = row - i;
                if( leftLine.contains(left) ) {
                    continue;
                }
                int rigth = row + i;
                if( rigthLine.contains(rigth) ) {
                    continue;
                }
                queens[row] = i;
                cols.add(i);
                leftLine.add(left);
                rigthLine.add(rigth);
                DFS(row+1, n);
                queens[row] = -1;
                cols.remove(i);
                leftLine.remove(left);
                rigthLine.remove(rigth);
            }
        }
    
        public List<List<String>> solveNQueens(int n) {
            queens = new int[n];
            Arrays.fill(queens, -1);
            cols = new HashSet<>();
            leftLine = new HashSet<>();
            rigthLine = new HashSet<>();
            res = new ArrayList<>();
            DFS(0, n);
            return res;
        }
    }
    
  • 相关阅读:
    运算符
    转载:C/C++源代码到可执行程序的过程详解
    #define与运算精度问题探究
    字符数组char
    解决蓝屏代吗0x0000007B的几种常见办法
    转载~vim配置文件
    Ubuntu kill命令用法详解
    How To Ask Questions The Smart Way
    提问的智慧
    【NOIP2012提高组】国王游戏 贪心 + 高精度
  • 原文地址:https://www.cnblogs.com/Asimple/p/16307684.html
Copyright © 2020-2023  润新知