首页 > 其他分享 >【坚持每日一题9.24】八皇后

【坚持每日一题9.24】八皇后

时间:2023-03-23 21:05:15浏览次数:40  
标签:9.24 int List solutions new 皇后 一题 row queens


设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

注意:本题相对原题做了扩展

示例:

输入:4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q…",  // 解法 1
  “…Q”,
  “Q…”,
  “…Q.”],

["…Q.",  // 解法 2
  “Q…”,
  “…Q”,
  “.Q…”]
]

java代码:

class Solution {
    public List<List<String>> solveNQueens(int n) {
        int[] queens = new int[n];
        Arrays.fill(queens, -1);
        List<List<String>> solutions = new ArrayList<List<String>>();
        solve(solutions, queens, n, 0, 0, 0, 0);
        return solutions;
    }

    public void solve(List<List<String>> solutions, int[] queens, int n, int row, int columns, int diagonals1, int diagonals2) {
        if (row == n) {
            List<String> board = generateBoard(queens, n);
            solutions.add(board);
        } else {
            int availablePositions = ((1 << n) - 1) & (~(columns | diagonals1 | diagonals2));
            while (availablePositions != 0) {
                int position = availablePositions & (-availablePositions);
                availablePositions = availablePositions & (availablePositions - 1);
                int column = Integer.bitCount(position - 1);
                queens[row] = column;
                solve(solutions, queens, n, row + 1, columns | position, (diagonals1 | position) << 1, (diagonals2 | position) >> 1);
                queens[row] = -1;
            }
        }
    }

    public List<String> generateBoard(int[] queens, int n) {
        List<String> board = new ArrayList<String>();
        for (int i = 0; i < n; i++) {
            char[] row = new char[n];
            Arrays.fill(row, '.');
            row[queens[i]] = 'Q';
            board.add(new String(row));
        }
        return board;
    }
}


标签:9.24,int,List,solutions,new,皇后,一题,row,queens
From: https://blog.51cto.com/u_6813689/6145943

相关文章

  • 【坚持每日一题9.27】639. 解码方法 II
    一条包含字母 A-Z的消息通过以下的方式进行了编码:‘A’->1‘B’->2…‘Z’->26要解码一条已编码的消息,所有的数字都必须分组,然后按原来的编码方案反向映射回......
  • 【坚持每日一题10.18】回文排列
    给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例......
  • 每日一题-leetcode 单值二叉树
    如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回false。示例1:输入:[1,1,1,1,1,null,1]输出:true示例2:输......
  • 每日一题-leetcode 环绕字符串中唯一的子字符串
    把字符串s看作是 “abcdefghijklmnopqrstuvwxyz” 的无限环绕字符串,所以 s看起来是这样的:“…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…”.现......
  • 2023.3.23蓝桥杯集训·每日一题
    今日复习的内容是背包问题。记得动态规划问题的初始化。AcWing3382.整数划分解题思路考虑到本题是将一个数划分为\(2\)的幂的和,而\(2\)的\(i\)幂是可以无限使用......
  • 刷爆 LeetCode 双周赛 100,单方面宣布第一题最难
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周末是LeetCode第100场双周赛,你参加了吗?这场周赛整体没有Hard题,但是......
  • Java入门_一维数组_第一题_升序数组
    声明咱是个新手,没啥技术只会最基础的,见谅哈。更简化的方法还请大佬指教。题目:已知有个升序数组的数组,要插入一个元素,该数组顺序依然是升序。例如:{25,49,74,......
  • 51. N 皇后
    51.N皇后按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题研究的是如何将n 个皇后放置在n×n的棋盘上,并且使皇后彼此之......
  • 2023.3.15蓝桥杯集训·每日一题
    AcWing200.Hankson的趣味题题目描述Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。今天......
  • n-皇后问题(bfs)
        #include<iostream>usingnamespacestd;constintN=20;//N*N两倍intn;boolcol[N],dg[N],udg[N];//同一列,对角线,反对角线(标记一下是否可以走)charg[......