n皇后问题

news2024/9/20 20:33:47

n皇后问题

题目:

按照国际象棋的规则,皇后可以攻击与之处在同一行 或同一列 或同一斜线上的棋子。

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

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例1
输入:n = 4
输出:[[".Q..",
		"...Q",
		"Q...",
		"..Q."],
		
		["..Q.",
		"Q...",
		"...Q",
		".Q.."]]
示例2
输入:n = 1
输出:[["Q"]]
提示:
1 <= n <= 9

分析:

其实就是要抓住可以搜索的三个条件

  1. 同行不能有棋子

    //其实就是遍历列
    for(int col = 0; col < n; col++){
        if(map[x][col] == 'Q'){
            return false;
        }
    }
    
  2. 同列不能有棋子

    //其实就是遍历行
    for(int row = 0; row < n; row++){
        if(map[row][y] == 'Q'){
            return false;
        }
    }
    
  3. 同斜线不能有棋子

    同斜线比较麻烦,因为有左斜线和右斜线
    在这里插入图片描述

    从当前点往右下

    从当前坐标开始,往下x,y都增加

    //往右下
    int i = x + 1, j = y + 1;
    while(i < map.length && j < map.length){
        if(map[i][j] == 'Q'){
            return false;
        }
    	i++; j++;
    }
    

    从当前点往左上

    从当前坐标开始,往上x,y都减小

     //往左上
     i = x - 1; j = y - 1;
     while(i >= 0 && j >= 0 ){
         if(map[i][j] == 'Q'){
        	 return false;
         }
    	 i--; j--;
     }
    

    ​ 从当前点往右上

    ​ 从当前坐标开始,往上,x减小,y增加

    //往右上
    i = x - 1; j = y + 1;
    while (i >= 0 && j < map.length) {
    	if(map[i][j] == 'Q'){
    		return false;
    	}
    	i--;j++;
    }
    

    ​ 从当前点往左下

    ​ 从当前坐标开始,往下,x增加,y减小

     //往左下
     i = x + 1; j = y - 1;
     while(i < map.length  && j >= 0){
         if(map[i][j] == 'Q'){
         	return false;
     	}
    	 i++;j--;
     }
    

将上面三个代码合一

boolean isVaild(int x, int y,char[][] map){
        //同一 行|列 不能有棋子
        for(int i = 0; i < map.length; i++){
            if(map[x][i] == 'Q' || map[i][y] == 'Q'){
                return false;
            }
        }
        //同一斜线不能有棋子
        //往右下
        int i = x + 1, j = y + 1;
        while(i < map.length && j < map.length){
            if(map[i][j] == 'Q'){
                return false;
            }
            i++; j++;
        }
        //往左上
        i = x - 1; j = y - 1;
        while(i >= 0 && j >= 0 ){
            if(map[i][j] == 'Q'){
                return false;
            }
            i--; j--;
        }
        //往右上
        i = x - 1; j = y + 1;
        while (i >= 0 && j < map.length) {
            if(map[i][j] == 'Q'){
                return false;
            }
            i--;j++;
        }
        //往左下
        i = x + 1; j = y - 1;
        while(i < map.length  && j >= 0){
            if(map[i][j] == 'Q'){
                return false;
            }
            i++;j--;
        }
        return true;
}

根据上面代码,我们也可以知道肯定需要当前点搜索的坐标

我们以行为递增条件,然后每次遍历一行

这样我们就有了坐标
在这里插入图片描述
整体就是这样一个搜索过程,在最后一行收集答案即可

void dfs(int n, int row, char[][] map){
    if(row == n){
        //收集答案
        List<String> tmp = new ArrayList();
        for(int i = 0; i < n; i++){
            tmp.add(new String(map[i]));
        }
        ans.add(tmp);
        return;
    }
    for(int col = 0; col < n; col++){
        if(isVaild(row,col,map) == true && map[row][col] == '.'){
            //当前坐标可以放置棋子
            map[row][col] = 'Q';
            dfs(n,row+1,map);
            //回溯,清除棋子
            map[row][col] = '.';
        }
    }
}

整体代码如下

class Solution {
    List<List<String>> ans = new ArrayList();
    char[][] map;
    public List<List<String>> solveNQueens(int n) {
        map = new char[n][n];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                map[i][j] = '.';
            }
        }
        dfs(n,0,map);
        return ans;
    }
    void dfs(int n, int row, char[][] map){
        if(row == n){
            //收集答案
            List<String> tmp = new ArrayList();
            for(int i = 0; i < n; i++){
                tmp.add(new String(map[i]));
            }
            ans.add(tmp);
            return;
        }
        for(int col = 0; col < n; col++){
            if(isVaild(row,col,map) == true && map[row][col] == '.'){
                map[row][col] = 'Q';
                dfs(n,row+1,map);
                map[row][col] = '.';
            }
        }
        
    }
    
    boolean isVaild(int x, int y,char[][] map){
        //同一 行|列 不能有棋子
        for(int i = 0; i < map.length; i++){
            if(map[x][i] == 'Q' || map[i][y] == 'Q'){
                return false;
            }
        }
        //同一斜线不能有棋子
        //往右下
        int i = x + 1, j = y + 1;
        while(i < map.length && j < map.length){
            if(map[i][j] == 'Q'){
                return false;
            }
            i++; j++;
        }
        //往左上
        i = x - 1; j = y - 1;
        while(i >= 0 && j >= 0 ){
            if(map[i][j] == 'Q'){
                return false;
            }
            i--; j--;
        }
        //往右上
        i = x - 1; j = y + 1;
        while (i >= 0 && j < map.length) {
            if(map[i][j] == 'Q'){
                return false;
            }
            i--;j++;
        }
        //往左下
        i = x + 1; j = y - 1;
        while(i < map.length  && j >= 0){
            if(map[i][j] == 'Q'){
                return false;
            }
            i++;j--;
        }
        return true;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于java的大理旅游系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

professional issue复习

Legal concepts Development of UK law • The Kingdom of England was established in 927. • The Principality of Wales was established in 1216. Common law • Following 1066, a unified system of law (English common law) slowly came into existence. It was “c…

漫谈cgroup

什么是cgroup cgroup 是linux内核的一个功能&#xff0c;用来限制、控制与分离一个进程组的资源&#xff08;如CPU、内存、磁盘I/O等&#xff09;。它是由 Google 的两位工程师进行开发的&#xff0c;自 2008 年 1 月正式发布的 Linux 内核 v2.6.24 开始提供此能力。 cgroup …

代码随想录算法训练营第30天 二叉树 java :39. 组合总和 40.组合总和II 131.分割回文串

文章目录LeetCode 39. 组合总和本题题解思路LeetCode 40.组合总和II本题题解思路LeetCode 131.分割回文串本题题解思路那么在代码里什么是切割线呢&#xff1f;那么在代码里什么是切割线呢&#xff1f;总结LeetCode 39. 组合总和 本题题解 思路 根据递归三部曲来分析 递归函…

单板硬件设计:存储器

在单板设计中&#xff0c;无论是涉及到一个简易的CPU、MCU小系统或者是复杂的单板设计&#xff0c;都离不开存储器设计&#xff1a; 1、存储器介绍 存储器的分类大致可以划分如下&#xff1a; ROM和RAM指的都是半导体存储器&#xff0c;ROM在系统停止供电的时候仍然可以保持…

visudo配置sudo权限

visudo配置sudo权限配置visudo仅允许字符终端登陆(tty)--授权localhost允许图形和tty登陆--授权all用户组提权-示例配置在sudoers.d目录下创建授权文件--推荐五段式配置三段式配置检查sudoers配置是否有误如何在sudo运行的命令中防止使用参数结果验证配置visudo https://blog.…

【数据结构】8.2 插入排序

文章目录前言1. 直接插入排序直接插入排序算法直接插入排序性能分析2. 折半插入排序3. 希尔排序希尔排序算法希尔排序算法分析排序方法比较前言 类似于俺们打牌时的插入&#xff0c;每抓来一张牌的时候&#xff0c;就将它放在合适的位置上&#xff0c;插入一张牌之后手里的牌仍…

MQ相关概念

1) 队列管理器 队列管理器是MQ系统中最上层的一个概念&#xff0c;由它为我们提供基于队列的消息服务。 2) 消息 在MQ中&#xff0c;我们把应用程序交由MQ传输的数据定义为消息&#xff0c;我们可以定义消息的内容并对消息进行广义的理解&#xff0c;比如&#xff1a;用户的各种…

JavaWeb-FilterListener

JavaWeb-Filter&Listener 1&#xff0c;Filter 1.1 Filter概述 Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 如下图所示&#xff0c;浏览器可以访问服…

JAVA性能统计项目

一、项目背景&#xff1a;我们希望设计开发一个小的框架&#xff0c;能够获取接口调用的各种统计信息&#xff0c;比如&#xff0c;响应时间的最大值&#xff08;max&#xff09;、最小值&#xff08;min&#xff09;、平均值&#xff08;avg&#xff09;、百分位值&#xff08…

力扣OJ(2000+)

目录 2032. 至少在两个数组中出现的值 2037. 使每位学生都有座位的最少移动次数 2042. 检查句子中的数字是否递增 2097. 合法重新排列数对 2180. 统计各位数字之和为偶数的整数个数 2185. 统计包含给定前缀的字符串 2283. 判断一个数的数字计数是否等于数位的值 2287. …

基于MBD 的软件品质保证技术

基于MBD的软件是什么&#xff1f; 基于MBD的软件是基于模型开发的软件&#xff0c;主要应用于汽车、电子电气、机器人、航空、航天等行业。 ​​​ 与使用现有代码开发程序的方法不同&#xff0c;MBD 方法包括首先开发模型&#xff0c;将模型转换为代码&#xff0c;然后基于转换…

Ansys Speos | 2023R1 动态仿真助力车灯早期优化

前言 光学仿真是产品设计师应用的关键工具之一&#xff0c;能让用户在制作物理原型之前就通过数字环境体验产品。这对汽车领域来说显得尤为重要&#xff0c;随着汽车照明功能&#xff08;如转向指示灯&#xff09;越来越生动&#xff0c;TIER-1 需要能够在样件前&#xff0c;通…

Mac安装android studio

1. 下载as 下载地址 2. 安装 3. 启动软件 4.创建新项目 选择空白活动 名字为FirstApp&#xff0c;语言选择java 等待项目加载完毕 项目加载完毕 5.创建设备 6. 启动项目

【28】C语言 | 关于指针练习(1)

目录 1、下列输出什么 2、计算求和 3、使用指针打印数组内容 4、打印水仙花数 5、写一个函数&#xff0c;可以逆序一个字符串的内容 6、题目名称:打印菱形 6、喝汽水 7、猜名次 8、下列关于整形数组输出什么并解释 9、下列关于字符数组输出什么并解释 9.1 下列关于字…

【C++详解】——初识STL(string类的使用)

&#x1f4d6; 前言&#xff1a;STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且一个包罗数据结构与算法的软件框架。 目录&#x1f552; 1. string 概述&#x1f552; 2. 标准库中的stri…

【小程序 | 黑马优选】tabBar、首页制作

文章目录tabBar制作首页制作配置网络请求制作轮播图效果渲染轮播图的UI解构配置小程序分包点击轮播图跳转到商品详情页面封装 uni.$showMsg() 方法分类导航区制作楼层区域制作tabBar制作 在 pages 目录中&#xff0c;创建首页(home)、分类(cate)、购物车(cart)、我的(my) 这 4…

windows下zookeeper搭建

程序包下载 官网下载地址 下载解压后如下&#xff01; 注意&#xff0c;zookeeper需要java环境&#xff0c;如果配置了JAVA_HOME那最好&#xff0c;如果没配置就会出现点击bin下的zkServer.cmd后CMD窗口一闪而过 修改配置 如果本地端口没有特别要求可以直接复制conf下的zo…

多臂PEG衍生物8-Arm PEG-SAA,8-Arm PEG-Succinamide Acid,八臂PEG丁二酸酰胺

一&#xff1a;产品描述 1、名称 英文&#xff1a;8-Arm PEG-SAA&#xff0c;8-Arm PEG-Succinamide Acid 中文&#xff1a;八臂-聚乙二醇-丁二酸酰胺 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Carboxylic acid PEG Multi-arm PEGs 4、分子量&#xff1a;可定制…

IDEA新建js项目(hello)和执行js脚本

一)、安装Node.js具体操作参考:https://blog.csdn.net/xijinno1/article/details/128774375二)、IDEA中新建js项目(hello world)1.按照下图&#xff0c;新建js项目2.选中示例代码文件后点击鼠标右键&#xff0c;选中菜单栏中的 运行* 栏目运行代码(第一次运行代码的方式)3.若是…