码迷,mamicode.com
首页 > 其他好文 > 详细

51. N-Queens

时间:2016-05-08 06:37:37      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

    /*
     * 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;
    }

 

51. N-Queens

标签:

原文地址:http://www.cnblogs.com/zmyvszk/p/5469658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!