n皇后问题-java

news2024/11/26 16:46:54

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

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

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

相关文章

027——从GUI->Client->Server->driver实现对SR501的控制

目录 1、修改显示界面 2、 添加对SR501显示的处理和tcp消息的处理 3、 在服务器程序中添加对SR501的处理 4、 编写驱动句柄 5、 修改底层驱动 1、修改显示界面 有个奇怪的问题这里的注释如果用 就会报错不知道为啥&#xff0c;只能用#来注释 我把显示这里需要显示的器件的…

宝塔要注意的问题

数据库创建访问权限要全部人 反向代理1 打包dist,并不会有反向代理&#xff0c;所以宝塔里面要配置 反向代理2 这种去掉/api为/&#xff0c;上面的并没有去掉 rewrite ^/api/(.*)$ /$1 break;

mysql数据库表的数据显示到前端tableView

首先我们在ui视图设计中引入TableView, 定义一个model QSqlQueryModel *modelnew QSqlQueryModel(ui->tableView);model->setQuery(query);//将查询结果绑定到模型上ui->tableView->setModel(model); 将tableView内容设置成model然后就可以出现数据库的数据。示…

企业网站制作如何被百度收录

1、网站在百度中的整体评分 说俗点就是网站的权重&#xff0c;在优化过程中我们会见到很多网站出现秒收的情况&#xff0c;发布的文章几分钟就可以收录&#xff0c;这个通过SITE语法都可以去查询&#xff0c;那么这跟自己的网站权重以及内容更新习惯是有非常重要的关联。 我们…

Python-Qt上位机设计

1.下载designer软件 2.自己设计一个界面 3.在指定部件加入点击响应命令函数名 鼠标点击目标部件拖出信号线 4.保存生成.ui文件&#xff0c;用pycharm打开 5.生成.py文件 6.新建一个功能文件 上图中class MainWindow的具体代码不予展示。 7.生成exe文件 将写好的py文件保存&a…

产品推荐 | 基于Anlogic系列EG4S20 FPGA开发板

1、产品概述 国产FPGA是最近几年起来的产品。ANLOGIC 是国产FPGA组织一成员&#xff0c;ANLOGIC芯片具有性价比高特点。高云FPGA&#xff0c;很多用户都用在LED&#xff0c;电机控制&#xff0c;PLC设备上&#xff0c;接口扩展。在国产化平台&#xff0c;Altera &#xff0c;L…

Solaris安装Oracle RAC配置手册

一. Oracle RAC安装前的系统准备工作 检查安装包 ​pkginfo –i SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo pkg install SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo 1.1 创建系统用户和组(两节点都要执行 ro…

Python相关性分析

分析连续变量之间线性相关程度的强弱&#xff0c;并用适当的统计指标表示出来的过程称为相关分析。 可以直接绘制散点图&#xff0c;或者绘制散点图矩阵&#xff0c;或者计算相关系数来进行相关分析。 相关系数的计算如下所示&#xff1a; 示例数据&#xff1a; 计算百合酱蒸…

本地启用并操作Redis

本篇文章将向各位讲解redis的基础用法&#xff0c;废话不多说我们直接开始吧&#xff01; 首先需要下载redis到你本地&#xff0c;我这儿是下载到以下文件夹中&#xff1a; 双击redis-server.exe文件运行redis&#xff1a; 然后我们另外启用一个命令窗口&#xff08;需要进入你…

JDK11安装教程

文章目录 1、安装2、配置环境变量 1、安装 双击安装包&#xff0c;点击下一步 更改安装目录&#xff0c;点击下一步 等待安装完成 安装完成 2、配置环境变量 此电脑右键属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> 新建 变量名&#xff1a;JAVA_HOME变量…

发布!DolphinDB 白皮书正式上线官网!

对广大数据库用户而言&#xff0c;白皮书是极具参考价值的使用指南和学习手册。白皮书不但能深入剖析数据库的基础概念与架构&#xff0c;协助用户了解数据库的工作原理和应用技巧&#xff0c;更提供了丰富的实践案例&#xff0c;帮助用户从中汲取经验&#xff0c;避免在实际应…

Java 实际项目开发中最少必要知识汇总

一、面向过程和面向对象 程序设计语言分为面向过程和面向对象 对于面向过程&#xff0c;强调的是过程&#xff0c;关心的是我去做 对于面向对象&#xff0c;强调的是对象&#xff08;万物皆对象&#xff09;&#xff0c;更关心的是我该让谁去做&#xff0c;这里的谁指的就是对象…

AutoCoder 副作用,秒变命令行版Siri,再也不用复制黏贴命来管理大模型了

AutoCoder 可以通过你指定的文档&#xff0c;以及自动到搜索引擎进行搜索来获取信息&#xff0c;从而更好的帮你生成代码&#xff0c;但我们不满足&#xff0c;我们还希望能够对用户本地的文档进行索引&#xff0c;从而自动获取一些信息&#xff0c;帮助你本地的项目更好的迭代…

如何进行数据库的迁移与同步——【DBA 从入门到实践】第四期

在日常的数据库运维工作中&#xff0c;我们时常会面临数据库替换、机房搬迁、业务测试以及数据库升级等任务&#xff0c;这些任务都需要对数据进行迁移和同步操作。【DBA 从入门到实践】第4期&#xff0c;将引导大家深入了解数据库迁移的流程&#xff0c;并探讨在迁移过程中可用…

设计模式胡咧咧之策略工厂实现导入导出

策略模式&#xff08;Strategy Pattern&#xff09; 定义&#xff1a; 定义了一组算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互换。 本质: 分离算法&#xff0c;选择实现 应用场景 何时使用 一个系统有许多类&#xff0c;而区分他们的只是他们直接…

Python与数据库交互的最佳实践

Python作为一种强大且易于学习的编程语言&#xff0c;在数据处理和应用程序开发方面具有广泛的应用。在构建涉及数据存储和检索的应用程序时&#xff0c;Python与数据库的交互成为关键的一环。本文将深入探讨Python与数据库交互的最佳实践&#xff0c;帮助读者更好地理解和应用…

软考 系统架构设计师系列知识点之大数据设计理论与实践(10)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;9&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第3节 Lambda架构 19.3.5 Lambda架构优缺点 1. 优点 &#xff08;1&#xff09;容错性好 Lambda架构为大数…

你信不信,五分钟快速学习Nginx

Nginx是什么&#xff1f; Nginx 是一个高性能的HTTP和反向代理服务器。它是由俄罗斯程序员Igor Sysoev开发的&#xff0c;最初是为了解决俄罗斯大型的门户网站的高流量问题。 说到反向代理&#xff0c;那么有没有正向代理呢&#xff1f; 正向代理&#xff1a;客户端非常明确要…

二叉树的中序遍历 - LeetCode 热题 36

大家好&#xff01;我是曾续缘&#x1f603; 今天是《LeetCode 热题 100》系列 发车第 36 天 二叉树第 1 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输…

考研数学|《1800》《660》《880》如何选择和搭配?(附资料分享)

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…