美文网首页
LeetCode 51.N皇后

LeetCode 51.N皇后

作者: 陈陈chen | 来源:发表于2021-09-29 12:41 被阅读0次

1、题目

image.png

2、分析

这道题目的主要困难,是在于怎么记住上一层选择的状态,这里定义一个char[][] 数组作为棋盘。
这道题要注意下char怎么转成题目要求的List数组回去。

其他的直接套用回溯算法的框架即可:

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

3、 代码

class Solution {
    List<List<String>> res = new LinkedList<>();
    public List<List<String>> solveNQueens(int n) {
        char[][] board = new char[n][n]; //注意
        for(char[] c : board){
            Arrays.fill(c, '.');
        }
        backTack(0, board);
        return res;
    }
    private void backTack(int row, char[][] board){
        int n = board.length;
        //结束条件
        if(row == n){
            res.add(charToList(board)); //注意
            return;
        }
        for(int i = 0; i < n; i++){
            if(!isValid(row, i, board)){
                continue;
            }
            //做出选择
            board[row][i] = 'Q';
            //递归下一层
            backTack(row + 1, board);
            //撤销选择
            board[row][i] = '.';
        }
    }

    private boolean isValid(int row, int col, char[][] board){
        int n = board.length;
        //判断这一列上方是否有Q
        for(int i = 0; i < row; i++){
            if(board[i][col] == 'Q')
               return false;
        }
        //判断左上方是否有Q
        int i = row, j = col;
        while(true){
            if(--i < 0 || --j < 0) break;
            if(board[i][j] == 'Q')
               return false;
        }
        //判断右上方是否有Q
        i = row; j = col;
        while(true){
            if(--i < 0 || ++j == n) break;
            if(board[i][j] == 'Q')
               return false;
        }
        return true;
    }

    public List<String> charToList(char[][] board){
        List<String> list = new ArrayList<>();
        for(char[] c : board){
            list.add(String.copyValueOf(c));
        }
        return list;
    }
}

相关文章

  • LeetCode 51.N皇后

    1、题目 2、分析 这道题目的主要困难,是在于怎么记住上一层选择的状态,这里定义一个char[][] 数组作为棋盘...

  • leetcode刷题汇总复习

    这里是我leetcode中所有做过的题目的汇总,方便自己复习 297.二叉树的序列化与反序列化** 51.N皇后 ...

  • 51.N皇后

  • 51.N皇后

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

  • 51.N皇后(回溯法)

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

  • LeetCode N皇后和数独的递归思路分析

    分析基于 LeetCode #51 N皇后 和 LeetCode #37 数独求解。 1. 寻找递归变量 N皇后问...

  • N皇后问题

    N皇后是经典回溯问题,详见leetcode.51 N皇后本文代码来自leetcode官方解答,个人觉得写得很干练,...

  • 算法-递归回溯N皇后问题

    51. N 皇后[https://leetcode-cn.com/problems/n-queens/] 皇后的摆...

  • Python小白 Leetcode刷题历程 No.51-N

    Python小白 Leetcode刷题历程 No.51-No.55 N皇后、N皇后Ⅱ、最大子序和、螺旋...

  • LeetCode 51. N-Queens

    Leetcode : N-QueensDiffculty:Hard N皇后问题,对八皇后问题的扩展,典型的回溯法算...

网友评论

      本文标题:LeetCode 51.N皇后

      本文链接:https://www.haomeiwen.com/subject/lsrenltx.html