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,分别表示列、斜对角线、、反斜对角线。

图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代码模板,最重要的不要忘记进行回溯操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

部署Hyperledger Fabric测试区块链网络

一. 快速启动区块链测试网络 启动Fabric虚拟机 将 fabric-samples.zip 拷贝进虚拟机 ubzip fabric-samples.zip 解压并重命名为fabric-samples mv fabric-samples-main fabric-samples 拷贝bin和config目录 cd fabric-samples cp ~/fabric/bin bin -r cp ~/fabric/config …

民族运动饮料之父『健力宝』×企企通正式启动SRM项目,打造饮料行业采购数字化应用标杆

近日&#xff0c;为推进采购阳光化、数字化和智能化&#xff0c;提升管理效率与质量&#xff0c;企企通与中国电解质饮料的领军品牌广东健力宝股份有限公司&#xff08;以下简称“健力宝”&#xff09;成功签约并召开项目启动会。健力宝行政副总裁赵总、CIO李总、采购本部总监杨…

矿用连续式负压自动排渣放水器——YC型

从今天起&#xff0c;努力去做一个可爱的人&#xff0c;不羡慕谁&#xff0c;也不埋怨谁&#xff0c;在自己的道路上&#xff0c;欣赏自己的风景&#xff0c;遇见自己的幸福。 矿用连续式负压自动排渣放水器——YC型 【1-5-9】产品介绍 连续式式负压自动排渣放水器采用双罐体结…

web自动化系列-selenium的3种等待方式(十一)

在ui自动化测试中&#xff0c;几乎出现问题最多的情况就是定位不到元素 &#xff0c;当你的自动化在运行过程中 &#xff0c;突然发现报错走不下去了 。很大概率就是因为找不到元素 &#xff0c;而找不到元素的一个主要原因就是页面加载慢 &#xff0c;代码运行速度快导致 。 …

Redis的RedisObject和对外可见的5种数据结构

目录 RedisObject Redis的编码方式 对外可见的5种数据结构 1.string string结构的源码 为什么是小于44字节会采用embstr编码&#xff1f; embstr和raw区别 2.list list结构的源码 3.set set结构的源码 4.zset zset结构的源码 5.hash hash结构的源码 Redis中…

EtherCAT开发_2_SSC使用记录

SSC快速开始参考《EtherCAT Slave Design Quick Guide》 字段内容直接参考SSC工具右侧Description&#xff0c;本文未填写。中文也可直接参考:《https://blog.csdn.net/g360250466/article/details/129847081》 ① Select EL9800 | 8Bit Digital I/O, 16Bit Analog Input 一、S…

Intel性能分析工具Vtune安装和使用简介

一、介绍 Intel Vtune profiler是用于串行和多线程应用程序的性能分析工具&#xff0c;可以帮助软件开发人员对应用程序的性能问题进行分析&#xff0c;支持包括linux和windows在内的多种操作系统。主要功能包括&#xff1a; 性能分析&#xff1a;可以对应用程序进行深入的性…

如何将低分辨率的视频变高清,使用AI工具分辨率画质增强至1080P、4K或者8K(附工具)

环境&#xff1a; Topaz Video AI 5.0 问题描述&#xff1a; 如何将低分辨率的视频变高清&#xff0c;使用AI工具分辨率画质增强至1080P、4K或者8K 原视频 增强1080P 解决方案&#xff1a; 1.打开软件&#xff0c;导入要处理的视频&#xff08;工具在本文最后附上&#xf…

网络安全:绕过 MSF 的一次渗透测试

这次渗透的主站是 一个 Discuz!3.4 的搭建 违法招 piao 网站&#xff0c; 配置有宝塔 WAF 用 Discuz!ML 3.X 的漏洞进行攻击&#xff0c;但是没有成功 发现主站外链会有一个发卡网&#xff0c;引导人们来这充值&#xff0c;是 某某发卡网&#xff0c;而且域名指向也是主站的 ip…

Stable Diffusion 模型分享:CyberRealistic XL(真实)cyberrealisticXL_v11VAE.safetensors

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍

计算机网络基础:宏观认识

目录 一、网络发展背景与基本概念 二、网络协议的意义与TCP/IP五层结构模型 三、网络传输的基本流程与封装分用 四、ip地址和mac地址 随着信息技术的飞速发展&#xff0c;计算机网络已经成为了现代社会不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们几乎都离…

Crossref

https://baijiahao.baidu.com/s?id1766583173146005960&wfrspider&forpc https://zhidao.baidu.com/question/1796197318615421547.html

Java垃圾回收2

垃圾回收的算法有哪些 通过可达性分析算法&#xff0c;我们已经可以找到需要回收的对象。现在需要通过垃圾回收算法&#xff0c;把垃圾回收&#xff0c;释放内存。 1.标记清除算法(使用较少) 标记清除算法&#xff0c;是将垃圾回收分为2个阶段&#xff0c;分别是标记和清除。…

面试官:来说说vue3是怎么处理内置的v-for、v-model等指令?

前言 最近有粉丝找到我&#xff0c;说被面试官给问懵了。 粉丝&#xff1a;面试官上来就问“一个vue文件是如何渲染成浏览器上面的真实DOM&#xff1f;”&#xff0c;当时还挺窃喜这题真简单。就简单说了一下先是编译成render函数、然后根据render函数生成虚拟DOM&#xff0c;…

国外GIS软件排名简介<30个>

简介 国外gisgeography网站进行了一次GIS软件排名&#xff0c;通过分析、制图、编辑等因素进行测试&#xff0c;具体规则如下&#xff1a; 分析&#xff1a;矢量/栅格工具、时态、地统计、网络分析和脚本。 制图&#xff1a;地图类型、坐标系、地图布局/元素、标注/注记、3D …

请勿假设你的用户都有管理员权限

有些人觉得自己很聪明&#xff0c;他们在程序中做了这样一项”优化”。 在程序的安装阶段&#xff0c;他们不会安装某些程序功能&#xff0c;而是等到用户第一次使用的时候才执行&#xff0c;也即所谓的 “按需加载”。 问题在于&#xff0c;第一次使用的时候&#xff0c;用户…

CSS-布局

display display 属性是用于控制 布局 的最重要的 CSS 属性。display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 block block&#xff1a;块级元素。块级…

从二本调剂到上海互联网公司算法工程师:我的成长故事

探讨选择成为一名程序员的原因&#xff0c;是出于兴趣还是职业发展&#xff1f; 在这个科技飞速发展的时代&#xff0c;程序员这一职业无疑成为了许多人眼中的香饽饽。那么&#xff0c;是什么驱使着越来越多的人选择投身于这一行业呢&#xff1f;是出于对编程的热爱&#xff0…

三步教你怎么把icloud照片恢复至iphone!

“我手机里面照片被优化后&#xff0c;然后不小心把所有被优化的模糊照片从手机中删除了&#xff0c;但是iCloud还有&#xff0c;我应该怎样把iCloud的照片重新放回手机&#xff1f;谢谢。” 在使用iPhone时&#xff0c;iCloud照片库是一个非常方便的功能&#xff0c;它允许你在…

文化=知识+素质!电动车限制多!——早读(逆天打工人爬取热门微信文章解读)

你是一个有文化的人&#xff01; 引言Python 代码第一篇 洞见 一个人有没有文化&#xff0c;就看这五点第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 知耻近乎勇 文化教会我们自省 以羞耻心为镜 照见自我 不断向善向上。 引言 绝了 昨天晚上早早上床 10点左右就睡眠模…