• LeetCode——N皇后


    Q:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
    PS:皇后可以攻击同⼀⾏、同⼀列、左上左下右上右下四个⽅向的任意单位。
    给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

    示例:
    输入: 4
    输出: [
    [".Q..", // 解法 1
    "...Q",
    "Q...",
    "..Q."],

    ["..Q.", // 解法 2
    "Q...",
    "...Q",
    ".Q.."]
    ]
    解释: 4 皇后问题存在两个不同的解法。

    A:回溯法

        private List<List<String>> result = new ArrayList<>();
    
        public List<List<String>> solveNQueens(int n) {
            if (n == 0)
                return result;
            List<Integer> l = new ArrayList<>();
            if (n == 1) {
                List<String> l1 = new ArrayList<>();
                l1.add("Q");
                result.add(l1);
                return result;
            }
            help(0, n, l);
            return result;
        }
    
        private void help(int row, int n, List<Integer> l) {
            if (row == n) {
                List<String> strList = new ArrayList<>();
                for(Integer num : l){
                    char[] t = new char[n];
                    Arrays.fill(t,'.');
                    t[num] = 'Q';
                    strList.add(new String(t));
                }
                result.add(strList);
                return;
            }
            for (int col = 0; col < n; col++) {
                if (!l.contains(col)) {
                    if (!isDiagonal(l, col)) {
                        l.add(col);
                        help(row + 1, n, l);
                        l.remove(l.size() - 1);
                    }
                }
            }
        }
    
        private boolean isDiagonal(List<Integer> currentQueen, int col) {
            int currentRow = currentQueen.size();
            for (int row = 0; row < currentQueen.size(); row++) {
                //判断对角线
                if (Math.abs(currentRow - row) == Math.abs(col - currentQueen.get(row))) {
                    return true;
                }
            }
            return false;
        }
    
  • 相关阅读:
    cocos2dx动画常见特效(转)
    cocos2dx常见Action(转)
    cocos2dx常见场景切换动画(转)
    android AlertDialog.Builder(Context context)换行
    使用NPOI操作Excel文件及其日期处理
    java jar文件打包成exe(Launch4j使用说明)
    知识日志2
    知识日记1
    框架体系对小软件作坊的 重要性 第二章
    框架体系对小软件作坊的 重要性 第一章
  • 原文地址:https://www.cnblogs.com/xym4869/p/12630902.html
Copyright © 2020-2023  润新知