zoukankan      html  css  js  c++  java
  • 51. N-Queens

        /*
         * 51. N-Queens 
         * 2016.3.12 by Mingyang 
         * 在这道题目里面,到了最后一步,才把整个棋盘转换成List of String
         * 其余的大部分时间都是只是把棋盘相应的位置填满 另外这道题目走的方式,不是像word
         * search那么上下左右到处走,而是在列数确定的情况下,行数从第一个到最后一个loop
         * 1.长度标准:无
         * 2.可选的范围:在col固定的情况下,遍历所有的row
         * 3.往前走一步:如果某一个row可以就检查是否validate,并且把棋盘上的值改了
         * 4.后退一步:棋盘上的值改回来
         * 5.特别的case:column走到了最后一个
         * 6.关于重复:无
         * 这道题目其实并不难,最巧的地方是最开始的时候board全部赋值为.然后后面再改board
         * 这里就是把board 转变成了一个res
         */
        public List<List<String>> solveNQueens(int n) {
            char[][] board = new char[n][n];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    board[i][j] = '.';
            List<List<String>> res = new ArrayList<List<String>>();
            dfs(board, 0, res);
            return res;
        }
        private void dfs(char[][] board, int colIndex, List<List<String>> res) {
            if (colIndex == board.length) {
                res.add(construct(board));
                return;
            }
            for (int i = 0; i < board.length; i++) {
                if (validate(board, i, colIndex)) {
                    board[i][colIndex] = 'Q';
                    dfs(board, colIndex + 1, res);
                    board[i][colIndex] = '.';
                }
            }
        }
        private boolean validate(char[][] board, int x, int y) {
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < y; j++) {
                    if (board[i][j] == 'Q'&& (x + j == y + i || x + y == i + j || x == i))
            //注意不要忽略这里有两个对角线,一个是x + j == y + i,另外一个是x + y == i + j
            //另外一个问题就是因为j是这个点的左半边,所以右半边不用管,因为是从左往右加起走的
                        return false;
                }
            }
            return true;
        }
        private List<String> construct(char[][] board) {
            List<String> res = new LinkedList<String>();
            for (int i = 0; i < board.length; i++) {
                String s = new String(board[i]);
                res.add(s);
            }
            return res;
        }
  • 相关阅读:
    基于vue的购物车清单
    圣杯布局和双飞翼布局
    正则限制input负数输入
    vue.js devtools图标不亮
    将二维数组转换成一维数组(基于reduce)
    基于PROMISE解决回调地狱问题
    封装AJAX库(参考JQ)
    for in和for of的区别
    抢购倒计时的实现
    git clone --depth=1 后获取其他分支
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5469658.html
Copyright © 2011-2022 走看看