2024/2/17打卡DFS---经典n—皇后问题***

注意点:

        斜线上不能存放多个皇后,可以用截距表示,因为所有的直线斜率都为-1或者 1 ,不会存在截距相同的直线。

        截距为负数的直线,可以用n+abs(截距)处理。

另一种处理截距的方式:(更优雅)

        我们可以对 5*5 正方形进行一个枚举
                (0,0) (0,1) (0,2) (0,3) (0,4)
                (1,0) (1,1) (1,2) (1,3) (1,4)
                (2,0) (2,1) (2,2) (2,3) (2,4)
                (3,0) (3,1) (3,2) (3,3) (3,4)
                (4,0) (4,1) (4,2) (4,3) (4,4)
        这是,坐标,可以理解为一个是x,一个是y
        仔细观察,每条从右上到左下的对角线,他们横纵坐标相加的值都是相等的,对比下面图看一下
                (0) (1) (2) (3) (4)
                (1) (2) (3) (4) (5)
                (2) (3) (4) (5) (6)
                (3) (4) (5) (6) (7)
                (4) (5) (6) (7) (8)
        因此 x+y 为 可以来表示该条直线(k = 1)
        同样的,x - y + n 的值也列出来
        (5) (4) (3) (2) (1)
        (6) (5) (4) (3) (2)
        (7) (6) (5) (4) (3)
        (8) (7) (6) (5) (4)
        (9) (8) (7) (6) (5)

        可以看出从左上到右下的对角线的值都是相等的。 

来自843. n-皇后问题 - AcWing题库

其他的直接套dfs模板即可。

1_597ec77c49-8-queens.png

两种写法

n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。

其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

注意:行末不能有多余空格。

输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围

1≤n≤9

输入样例:
4
输出样例:
.Q..
...Q
Q...
..Q...Q.
Q...
...Q
.Q..

 写法一:

// 截距问题,up代表向上的斜率,down代表向下的斜率,如果斜率是负数,那么就表示为n+abs(k),列就用link表示
// dfs遍历行,因此不用对行进行标记
import java.util.*;class Main{static int N = 10;static int n;static String[][] a = new String[N][N];static boolean[] up = new boolean[2*N]; // 斜率为1的截距,截距可能为负数static boolean[] down = new boolean[2*N]; // 斜率为-1的截距,截距都为正数static boolean[] link = new boolean[N]; // 列public static void main(String[] args){Scanner in = new Scanner(System.in);n = in.nextInt();for(int i=0;i<n;i++) // 将所有的点都初始化为"."for(int j=0;j<n;j++)a[i][j] = "."; dfs(0); // 0表示行,从第0行开始}public static void dfs(int x){if(x==n) { // 遍历到最后一行,输出,返回for(int i=0;i<n;i++){for(int j=0;j<n;j++){System.out.print(a[i][j]);if(j==n-1) System.out.println();}}System.out.println();return;}for(int i=0;i<n;i++){ // 遍历第x行int up_c = x-i>0?x-i:n+i-x; // 计算(x,i)点的两个截距int down_c = x+i;if(up[up_c]==false&&down[down_c]==false&&link[i]==false){ // 如果这个点能放a[x][i] = "Q";      up[up_c]=true;down[down_c]=true;link[i]=true;dfs(x+1);// 回溯 ,(有:该位置可以放皇后,但是不放的含义)a[x][i] = ".";      up[up_c]=false;down[down_c]=false;link[i]=false;}}return;}
}

写法二:

需要标记行 

import java.util.*;class Main{static final int N = 10;static int n;static char[][] g = new char[N][N];static boolean[] row = new boolean[N]; // 行static boolean[] col = new boolean[N]; // 列static boolean[] dg = new boolean[2*N]; // k = -1static boolean[] udg = new boolean[2*N]; // k = 1public static void main(String[] args){Scanner in = new Scanner(System.in);n = in.nextInt();for(int i=0;i<n;i++)for(int j=0;j<n;j++)g[i][j] = '.';dfs(0,0,0);//从左下角(0,0)开始搜,记录Q的个数}static void dfs(int x,int y,int q){  // q用来记录皇后的数目if(y==n) { // 遍历当前行的最后一个y=0;x++;}if(x==n){ // 行遍历完if(q==n){ // 并且皇后数量等于nfor(int i=0;i<n;i++){ // 输出for(int j=0;j<n;j++){System.out.print(g[i][j]);}   System.out.println();               }System.out.println();  }return;}//当前位置不放皇后dfs(x,y+1,q);//当前位置放皇后放皇后if(row[x]!=true&&col[y]!=true&&dg[x+y]!=true&&udg[n-x+y]!=true){g[x][y] = 'Q';row[x]=col[y]=dg[x+y]=udg[n-x+y]=true;dfs(x,y+1,q+1);g[x][y] = '.';row[x]=col[y]=dg[x+y]=udg[n-x+y]=false;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter旋转动画,Android彻底组件化方案实践方法

Android基础 & 常用 针对Android基础&常用知识&#xff0c;我认为对于初级开发者来说&#xff0c;按照优先级最主要的知识点主要包括&#xff1a;四大组件、布局使用、多线程 & 动画&#xff1b;具体介绍如下&#xff1a; 2. Android进阶 针对Android进阶知识&am…

redis实现分布式全局唯一id

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1 使用 Redis 计数器实现2.2 使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1 导入依赖配置3.2 配置yml文件3.3 序列化配置3.4 编写获取工具3.5 测试获取工具 四、运行结果 一、前言 在很…

Northwestern University-844计算机科学与技术/软件工程-复试注意事项【考研复习】

本文提到的西北大学是位于密歇根湖泊畔的西北大学。西北大学&#xff08;英语&#xff1a;Northwestern University&#xff0c;简称&#xff1a;NU&#xff09;是美国的一所著名私立研究型大学。它由九人于1851年创立&#xff0c;目标是建立一所为西北领地地区的人服务的大学。…

Opencv基础与学习路线

Opencv Opencv每一篇目具体&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 Opencv(3)详解霍夫变换 Opencv(4)详解轮廓 Opencv(5)平滑处理 具体Opencv相关demo代码欢迎访问我的github仓库&#xff08;包含python和c代码&#xff09; demo代码 文章目录 Opencv一…

vivo 在离线混部探索与实践

作者&#xff1a;来自 vivo 互联网服务器团队 本文根据甘青、黄荣杰老师在“2023 vivo开发者大会"现场演讲内容整理而成。 伴随 vivo 互联网业务的高速发展&#xff0c;数据中心的规模不断扩大&#xff0c;成本问题日益突出。在离线混部技术可以在保证服务质量的同时&…

Golang 开发实战day01 - Variable String Numeric

Golang 教程01 - Variable String Numeric 1. Go语言的重要性 Go语言&#xff0c;又称Golang&#xff0c;是一种由Google开发的静态编译型编程语言。它于2009年首次发布&#xff0c;并在短短几年内迅速流行起来。Go语言具有以下特点&#xff1a; 语法简单易学&#xff1a;Go…

一线互联网架构师筑基必备技能之Android篇,快速从入门到精通

真正最能锻炼能力的便是直接去阅读源码&#xff0c;不仅限于阅读Android系统源码&#xff0c;还包括各种优秀的开源库。 由于整个文档比较全面&#xff0c;内容比较多&#xff0c;篇幅不允许&#xff0c;下面以截图方式展示 。 深入解析微信 MMKV 源码 初始化获取修改删除读取…

云计算 2月21号 (linux文件及用户管理)

一、文件管理 1.1快捷键 编辑命令&#xff1a; Ctrl a &#xff1a;移到命令行首 Ctrl e &#xff1a;移到命令行尾 Ctrl u &#xff1a;从光标处删除至命令行首 Ctrl k &#xff1a;从光标处删除至命令行尾 Ctrl w &#xff1a;从光标处删除至字首 Ctrl d &#x…

Linux系统中安装redis+redis后台启动+常见相关配置

1、下载Redis Redis官网&#xff1a;https://redis.io/ 历史版本&#xff1a; http://download.redis.io/releases 2、连接Linux&#xff08;或者VMwear&#xff09; 我们安装的是linux版本的redis 打开xftp我们需要先将我们的Redis上传到服务器上 解压到这里 解压的指令 …

赵本山与高秀敏夫妇本想找范伟要那1200元电视机垫款,却不好意思向范伟开口--小品《面子》(中1)的台词

赵本山与高秀敏夫妇本想找范伟要那1200元电视机垫款&#xff0c;却不好意思向范伟开口 --小品《面子》&#xff08;中1&#xff09;的台词 表演者&#xff1a;赵本山 高秀敏 范伟 &#xff08;接上&#xff09; 高秀敏&#xff1a;咱俩抓紧提事啊 赵本山&#xff1a;不着急…

librtmp源码分析

阅读了librtmp的源码&#xff0c;简单记录下。 首先补充下AMF格式基本知识 1 AMF格式 AMF是Action Message Format(动作消息格式)的简写&#xff0c;它是一种二进制的数据格式。它的设计是为了把actionscript里面的数据(包括Object, Array, Boolean, Number等)序列化成二进制…

【前端素材】推荐优质在线高端家具电商网页Classi平台模板(附源码)

一、需求分析 1、系统定义 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷渠道。 2、功能需求 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷…