N 皇后问题_用回溯法解N皇后问题

N 皇后问题_用回溯法解N皇后问题n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数n,返回所有不同的n皇后问题的解决方案。每一种解法包含一个明确的n皇后问题的棋子放置方案,该方案中‘Q’和‘.’分别代表了皇后和空位。示例如下:输入:4输出:[[".Q..",//解法1"…Q","Q…","…..

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例如下:


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

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
  • 采用回溯法解决如下:
class Solution {

    private List<List<String>> res = new ArrayList<>();
    private boolean[] col;    // false 代表竖方向没有皇后
    private boolean[] dia1;   // false 代表 左下 到 上右 对角线没有皇后, 这条对角线所有元素横纵坐标和相同
    private boolean[] dia2;   // false 代表 左上 到 下右 对角线没有皇后, 这条对角线所有元素横纵坐标差相同

    public List<List<String>> solveNQueens(int n) {

        if(n < 1)
            return res;

        col = new boolean[n];
        dia1 = new boolean[2*n-1];  // 对角线条数
        dia2 = new boolean[2*n-1];

        LinkedList<Integer> row = new LinkedList<>();
        putQueue(n, 0, row);

        return res;
    }

    // 尝试在一个n皇后问题中,摆放第index行的皇后位置
    public void putQueue(int n, int index, LinkedList<Integer> row){

        if(index == n){
            res.add(generateBoard(n ,row));
            return ;
        }

        for(int i=0; i<n; i++)
            if( !col[i] && !dia1[index+i] && !dia2[index-i+n-1]){   // index-i+n-1 :将横纵坐标差值转换为数组坐标
                row.addLast(i);
                col[i] = true;
                dia1[i+index] = true;
                dia2[index-i+n-1] = true;
                putQueue(n, index+1, row);
                row.removeLast();
                col[i] = false;
                dia1[i + index] = false;
                dia2[index-i+n-1] = false;
            }
        return ;
    }

    private List<String> generateBoard(int n, LinkedList<Integer> row){

        assert(row.size() == n);

        ArrayList<String> board = new ArrayList<>();
        for(int i = 0 ; i < n ; i++){
            char[] charArray = new char[n];
            Arrays.fill(charArray, '.');
            charArray[row.get(i)] = 'Q';
            board.add(new String(charArray));
        }
        return board;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187539.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于爱在线观看无删减版_unique individual

    关于爱在线观看无删减版_unique individual  如声明了一个变量为uniqueidentifier,  可以用NewID()方法来生成一个唯一的uniqueidentifier变量DECLARE@FUUIDuniqueidentifierSET@FUUID=NEWID()INSERTINTOOPENDATASOURCE(‘SQLOLEDB’…

    2022年9月7日
    0
  • gtest整理_softest

    gtest整理_softest目录简介使用目的使用时机使用方法测试样例使用心得简介gtest是一个跨平台的C++单元测试框架,由google公司发布。gtest提供了丰富的断言,供开发者对代码块进行白盒测试。使用目的测试代码逻辑是否正确。编译器只能检测出语法错误但是无法检测到逻辑错误,比如一个函数或类是否完成了期望的功能。单元测试可以帮助我们判断代码设计得是否清晰合理。一块代码的逻辑越清晰,它的单元测试就可以设计得越简单。方便并行开发。一个程序的有不同模块相互耦合,某个模块未完成可能影响其他已完成模块的测试,这时可以利用

    2022年9月1日
    2
  • matlab遗传算法实例求最短路径_遗传算法经典实例

    matlab遗传算法实例求最短路径_遗传算法经典实例Matlab遗传算法实例

    2022年9月12日
    0
  • Spring Cloud Security 整合 OAuth 2.0,从原理到实战一次说明白

    Spring Cloud Security 整合 OAuth 2.0,从原理到实战一次说明白若有收获,请记得分享和转发哦本篇文章介绍一下OAuth2.0相关的知识点,并且手把手带大家搭建一个认证授权中心、资源服务进行OAuth2.0四种授权模式的验证,案例源码详细,一梭子带大家了…

    2022年5月21日
    63
  • linux常用命令杀死进程_结束进程的命令

    linux常用命令杀死进程_结束进程的命令原文网址:简介法1:ps+grep等用法ps-ef|grepprocedure_name|grep-vgrep|awk'{print$2}’|xargskill-9procedure_name为进程名。分析ps-ef 列出所有进程 grepprocedure_name 查找指定进程名的进程 awk'{print$2}’ 筛选出进程的ID xargskill 杀死指定进程 法2:killall用法

    2022年9月27日
    0
  • 一种突发事件的时滞动力学模型 2019-nCoV与参数辨识[通俗易懂]

    一种突发事件的时滞动力学模型 2019-nCoV与参数辨识[通俗易懂]@TOC一种突发事件的时滞动力学模型2019-nCoV与参数辨识摘要在本文中,我们提出了一个具有时滞的动态系统来描述2019-nCoV在中国的爆发。这种传染病的一个典型特征是它可以在潜伏期传播,因此可以用微分方程中的时滞过程来描述。分类群体的累计数量作为变量,与官方数据一致,便于参数辨识。为2019-nCoV疫情的预测和参数识别提供了数值方法,数值结果表明,该动态系统能够较好地预测疫情的发展…

    2022年9月28日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号