n皇后问题-java

本次n皇后问题主要通过dfs(深度优先搜索)实现,加深对深度优先搜索的理解。

 

文章目录

前言

一、n皇后问题

二、算法思路

三、使用步骤

1.代码如下

2.读入数

3.代码运行结果

总结

 


 

前言

本次n皇后问题主要通过dfs(深度优先搜索)实现,加深对深度优先搜索的理解。


提示:以下是本篇文章正文内容,下面案例可供参考

一、n皇后问题

n皇后问题是指将n个皇后放到n*n的棋盘上面,皇后放置具有一定的规则,即每个皇后不能放在同一行,同一列,同一斜线上。

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

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

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

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

数据范围

1≤n≤9

二、算法思路

我们引入二维字符数组g来存储棋盘和皇后,皇后用字符‘Q’,表示,棋盘该空格上什么也没有用字符‘.’表示。分别引入一维布尔类型数组col、dg、udg,分别表示列、斜对角线、、反斜对角线。

3050a12366a04834a8dc41075a6122a7.png

图1.1 思路模拟

关于对角线我们可以通过截距来表示,即如果这些点都在同一个对角线线上,那么他们把横纵坐标代入算出来的截距b一定是相同的。反斜对角线的b =  y+x;那么斜对角线b = y - x,又因为这个值可以为负的,我们加一个n来保证值不会变成负的,那么范围会变成(0,2n),所以我们的布尔类型数组要开2倍的n大小。(注:因为我们每行就放一个皇后,那么行就不需要开布尔类型数组判断)。

我们通过dfs来传入参数x表示每一行,当然递归的出口就是我们把每一行都处理完,当此时的x = n时(x从0到开始),我们把此时的棋盘打印即可。然后dfs内部再枚举每一列y,当col[y] = dg[y-x+n] = udg[y+x] = false,那么就说明此时可以放置皇后,然后将g[x][y] = 'Q',再将ol[y] = dg[y-x+n] = udg[y+x] = true,然后递归的处理下一行(即dfs(x+1));当第一轮递归结束后,此时我们就把棋子进行回溯操作,把所有的东西恢复到初始状态即棋盘全部变为‘.’和修改过的布尔类型数组变为false;第一次处理是将第一行第一列放第一个皇后,然后递归处理后续情况;第二次处理是将第一行第二列放第一个皇后,递归处理最后的情况;最后知道第一行最后一列放第一个皇后,此时我们就将所有的情况都考虑到了。

当引入4个皇后到4*4棋盘的情况:

8b456f7737904a9fa402e83787be6e6b.png

 图1.2模拟(一)

图1.2展示当 我们让第一行第一列放置第一个皇后所出现的情形,无法得到放置4个皇后的情况。

670c55fc70994d56bc417f8e50e84032.png

图1.3模拟(二) 

 

93b75c34eca949ecae10f34f7314f4d9.png

图1.4模拟(三) 

图1.3和图1.4模拟的是当皇后分别放在 第一行第二列和第一行第三列且成功在棋盘上放置4个皇后的情况。

343836556fde453d965f8b3b5f8c3105.png  

 图1.5模拟(四)

图1.5模拟的是当皇后放在第一行第四列的所有情况,无法在棋盘上放置4个皇后。

三、使用步骤

1.代码如下

import java.io.*;
import java.util.*;public class n皇后问题 {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static int n = 0;//存储路径static char[][] g;//列static boolean[] col;//斜对角线static boolean[] dg;//斜写对角线static boolean[] udg;public static void main(String[] args) {Scanner sc = new Scanner(br);n = sc.nextInt();g = new char[20][20];col = new boolean[20];dg = new boolean[20];udg = new boolean[20];for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){g[i][j] = '.';}}dfs(0);pw.flush();}public static void dfs(int u){//当u=n时说明我们找到一种方案if(u == n){for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){pw.print(g[i][j]);}pw.println();}pw.println();return;}//行数int x = u;//枚举每一列for(int y = 0;y < n;y++){// 列   对角线      反对角线if(col[y] == false && dg[y-x+n] == false && udg[y+x] == false){g[x][y] = 'Q';//表示这些位置不能放了col[y] = dg[y-x+n] = udg[y+x] = true ;dfs(x+1);//回溯g[x][y] = '.';col[y] = dg[y-x+n] = udg[y+x] = false;}}}
}

2.读入数

4

3.代码运行结果

.Q..
...Q
Q...
..Q...Q.
Q...
...Q
.Q..

总结

我们主要理解dfs的原理,懂得如何套用dfs代码模板,最重要的不要忘记进行回溯操作。

 

 

 

 

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

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

相关文章

象棋教学辅助软件介绍

背景 各大象棋软件厂商都有丰富的题目提供训练&#xff0c;但是其AI辅助要么太弱&#xff0c;要么要付费解锁&#xff0c;非常不适合我们这些没有赞助的业余棋手自行训练&#xff0c;于是我需要对其进行视觉识别&#xff0c;和AI训练&#xff0c;通过开启这个辅助软件&#xf…

设计模式学习(六)——《大话设计模式》

设计模式学习&#xff08;六&#xff09;——《大话设计模式》 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff0c;也称为静态工厂方法模式&#xff0c;它属于类创建型模式。 在简单工厂模式中&#xff0c;可以根据参数的不同返回不同类的实例。简单工厂…

构建现代网页的引擎:WebKit架构揭秘

在网络信息迅猛增长的今天&#xff0c;浏览器已经成为我们接触世界的重要窗口。而在浏览器的核心&#xff0c;有一个强大的引擎在默默地支撑着网页的渲染和执行&#xff0c;这就是WebKit。 WebKit的核心组件 WebKit作为开源浏览器引擎&#xff0c;由苹果公司发展而来&#x…

排序(四)——归并排序 + 外排序

目录 1.归并排序递归实现 代码 2.归并排序非递归 代码 3.比较快排、归并和堆排序 4.归并排序实现外排序 1.归并排序递归实现 我们之前对两个有序数组进行排序就用到了归并的思想&#xff0c;对于两个有序数组&#xff0c;我们分别取他们首元素比较大小&#xff0c;取小的插…

Unity给地图物体添加对撞机

在项目/Assets下创建Prefabs文件夹 选择素材拖入层级下&#xff0c;注意此时地图素材有可能看不到&#xff0c;此时选择Tilemap在检查器中修改图层顺序调至最低。 添加对撞机 选择素材&#xff0c;在检查器中点击添加组件Box Collider 2D&#xff0c;将素材拖入Prefabs文件下…

【Arduino IDE 环境配置】

目录 Arduino IDE 环境配置 1. 安装方式2. 操作方法&#xff08;Arduino中文社区&#xff09; 2.1. 安装Arduino IDE2.2. 下载固件2.3. 修改Arduino IDE语言2.4. 添加开发板管理网址2.5. 运行离线包2.6. 检查安装是否成功 下载Arduino IDE&#xff1a; 如果你还没有安装Arduin…

如何使用Postgres的JSONB数据类型进行高效查询

文章目录 解决方案1. 创建包含JSONB列的表2. 插入JSON数据3. 使用GIN索引加速查询4. 执行高效的JSONB查询 示例代码解释 PostgreSQL的JSONB数据类型提供了一种灵活的方式来存储和查询JSON格式的数据。JSONB不仅允许你在PostgreSQL数据库中存储JSON文档&#xff0c;而且还对这些…

科技云报道:大模型加持后,数字人“更像人”了吗?

科技云报道原创。 北京冬奥运AI 虚拟人手语主播、杭州亚运会数字人点火、新华社数字记者、数字航天员小诤…当随着越来越多数字人出现在人们生活中&#xff0c;整个数字人行业也朝着多元化且广泛的应用方向发展&#xff0c;快速拓展到不同行业、不同场景。 面向C端&#xff0…

.NET开源免费的跨平台框架 - MAUI(附学习资料)

前言 前几天分享了一个.NET MAUI开源免费的UI工具包 - Uranium&#xff0c;然后技术群有不少同学问.NET MAUI是不是免费的&#xff1f;能做什么&#xff1f;今天特意写这篇文章来介绍一下.NET开源、免费&#xff08;基于MIT License&#xff09;的跨平台框架&#xff1a;MAUI。…

【刷题笔记】第八天

文章目录 [928. 尽量减少恶意软件的传播 II](https://leetcode.cn/problems/minimize-malware-spread-ii/)方法1&#xff1a;dfs方法2&#xff1a;并查集 [GCD and LCM](https://vjudge.net.cn/problem/Aizu-0005)[Missing Bigram](https://vjudge.net.cn/problem/CodeForces-1…

基于springboot+vue+Mysql的简历系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

数据赋能(60)——要求:数据服务部门能力

“要求&#xff1a;数据服务部门实施数据赋能影响因素”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据服务部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据服务部门应具备的关键能力如下。 业务理解和沟…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库&#xff0c;具有分布式计算、事务支持、多模存储、以及流批一体等能力&#xff0c;非常适合作为一款理想的轻量级大数据平台&#xff0c;轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式&#xff0c;介绍如何通过 Dolphin…

MySQL 的事务

事务概念 MySQL事务是一个或者多个的数据库操作&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。 事务是通过事务日志来实现的&#xff0c;事务日志包括&#xff1a;redo log和undo log。 事务状态 事务有以下五种状态&#xff1a; 活动的部分提交的失败的中止的…

使用GAN做图像超分——SRGAN,ESRGAN

在GAN出现之前&#xff0c;使用的更多是MSE&#xff0c;PSNR,SSIM来衡量图像相似度&#xff0c;同时也使用他们作为损失函数。 但是这些引以为傲的指标&#xff0c;有时候也不是那么靠谱&#xff1a; MSE对于大的误差更敏感&#xff0c;所以结果就是会倾向于收敛到期望附近&am…

【深度学习】wandb模型训练可视化工具使用方法

【深度学习】wandb模型训练可视化工具使用方法 wandb简介功能介绍登陆注册以及API keysproject和runsproject和runs的关系 wandb的配置实验跟踪版本管理Case可视化分析可视化自动调参&#xff08;wandb.sweep&#xff09;配置wandb.sweep1.配置 sweep_config2.初始化 sweep con…

【python】flask中ORM工具SQLAIchemy,各种数据查询操作详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python 密码学实用指南(全)

原文&#xff1a;zh.annas-archive.org/md5/fe5e9f4d664790ea92fb33d78ca9108d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 密码学在保护关键系统和敏感信息方面有着悠久而重要的历史。本书将向您展示如何使用 Python 加密、评估、比较和攻击数据。总的来说&…

Qt对话框

文章目录 创建普通的对话框对话框的内存泄露问题自定义对话框模态式对话框QMessageBox&#xff08;消息对话框&#xff09;对话框类型对话框按钮接收对话框返回值演示其他创建方式 QColorDialog&#xff08;颜色对话框&#xff09;案例 QFileDialog&#xff08;文件对话框&…

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用&#xff0c;以下是一些应用最广泛的场景&#xff1a; 工业制造&#xff1a;通过模拟制造过程&#xff0c;可以预测产品的质量和性能&#xff0c;优化生产流程&#xff0c;降低成本。航空航天&#xff1a;飞机、导弹、航天器等的设计和研发…