leetcode51. N 皇后(java详解)

这篇博客详细介绍了如何使用递归算法解决经典的N皇后问题。文章中,作者定义了一个`Solution`类,通过维护一个二维字符数组`arr`来表示棋盘,并使用`List<List<String>>`的`ans`列表存储所有可能的解决方案。在`getAns`方法中,作者实现了递归逻辑,检查每一步放置皇后是否合法,并通过回溯找到所有解。此外,还提供了`isLegal`方法来判断皇后位置是否符合规则(不在同一行、同一列或对角线上)。最后,`solveNQueens`方法作为对外接口,返回所有可能的解决方案列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:题目

在这里插入图片描述

二:上码

class Solution {
    /**
        思路:1.先说我们选用的数据结构;我们是选取的是List<List<string>> ans 来存每次的结果;
               我们在创建这个二维矩阵的时候用的是char的二维数组,那么的话等到我们得到一种
                可行解的时候  将char的二维数组每一行转换成 String 并存入 ans 中
            2:判断可行性
                1>:不能在同一行
                2>:不能在同一列
                3>:不能在同一对角线
                  这里就是给出我们的一个坐标 然后在char[][]数组 遍历上方三个条件
                  那么的话 判断是否合法
            3.递归三步曲
                1>:确定递归函数和递归参数
                    void getAns(int rows,int n)
                2>:确定回溯终止条件
                    if (rows == n) 行数也就是我们的n (rows是从0开始的 那么达到n也就是比正常的范围大一个)
                3>:确定回溯体    
                    这里的for循环其实就是我们的不同的列
                    那么我们根据参数中的行 那么我们就组成了(行,列)
                    那么的话 我们就可以确定出一个坐标 
                    并根据该坐标是否合法来判断是否给该坐标进行赋值
                   
    */

    private List<List<String>> ans = new ArrayList<>();
    private char[][] arr;
    
    public void fillArr() {
        for (char[] chA: arr) {
            Arrays.fill(chA,'.');
        }
    }

    public List<String> getString() {
        List<String> list = new ArrayList<>();
        for (char[] chA: arr) {//将二维char数组中的每一行转换成一个字符串 存放在list中
            list.add(String.copyValueOf(chA));
        }
        return list;
    }

    //判断坐标(row,col)这个坐标是否合法
    public boolean isLegal(int row,int col,int n) {    
        //是否在同一列
        for (int i = 0; i < row; i++) {
            if (arr[i][col] == 'Q') return false;
        }

        //45°角
        for (int i = row-1,j = col-1; i >= 0 && j >= 0; i--,j--) {
            if (arr[i][j] == 'Q') return false;
        }

        //135°
        for (int i = row-1,j = col+1; i >= 0 && j < n; i--,j++) {
            if (arr[i][j] == 'Q') return false;
        }

        return true;
    }
    
    public void getAns(int rows,int n) {
        
        if (rows == n) {
            ans.add(getString());
        }

        for (int col = 0; col < n; col++) {
            if (isLegal(rows,col,n)) {
                arr[rows][col] = 'Q';
                getAns(rows+1,n);
                arr[rows][col] = '.';
            }
        }
    }
    public List<List<String>> solveNQueens(int n) {
        arr = new char[n][n];
        fillArr();
        getAns(0,n);
        return ans; 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值