回溯算法编程题代表——N皇后

本文介绍了N皇后问题的两种变体,重点讨论了如何使用回溯算法解决N皇后I问题。N皇后I问题要求在n×n棋盘上放置n个皇后,使得它们互不攻击。解决方案通过递归实现,判断当前位置是否能放皇后并进行回溯。N皇后II问题则是求解不同的解决方案数量。给出了示例和思路分析。
摘要由CSDN通过智能技术生成

回溯算法编程题代表——N皇后

N 皇后 I

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例一:
n=4
在这里插入图片描述
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
核心思想:回溯。
以行为单位,每次只需要往不同列Q即可,但是不是简单的放Q,而是当前位置的同一行、同一列、两条斜线上都不能有皇后,所以要判断当前位置是否能放皇后,由于是从第0行开始,所以当前行以下肯定没皇后,所以只用判断当前列、左上角斜线、右上角斜线,当都没有皇后时就可以往当前位置放皇后了,以此进行递归即可,那递归的终止条件呢?我们从输出中分析,很明显,子顺序表中的每一个元素分别对应每一行的可能,所以需要用一个顺序表去保存结果,所以递归终止条件就是当子顺序表的长度达到n时就结束递归。
如何回溯?
当将本行的皇后以及不是皇后的位置设置好后,继续递归,本次递归完成后,将子顺序表中的最后一个元素移除,并将标记当前皇后位置的数组的值变为空,实现回溯。

class Solution {
   
    List<List<String>>list=new ArrayList<>();
    public List<List<String>> solveNQueens(int n) {
   
        char[][]quen=new char[n][n];//记录皇后位置
        solve(quen,new ArrayList<String>(),0);//从第零行开始
        return list;
    }
    public void solve(char[][]quen,List<String>l,int cow){
   
        if(l.size()==quen.length){
   
            list.add(new ArrayList<String>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值