n-皇后问题(DFS)

news2024/11/17 0:23:09

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

1_597ec77c49-8-queens.png

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

输入格式

共一行,包含整数 n。

输出格式

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

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

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

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

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

数据范围

1≤n≤9

输入样例:

4

输出样例:

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

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

这题的难度就在于对于斜边的判定处理,解释放在代码里,这里直接给出代码

代码如下:

1.第一种方式(在看懂题意下可以知道每行只能放一个皇后,这样写代码更简单时间复杂度,推荐)

//第一种搜索方式
#include<iostream>
using namespace std;
const int N=20;
int n;
char g[N][N];
//由于国际象棋皇后的十字方向以及斜方向都能走,因此每行只能放一个皇后,定义一个行数组xiaochou,正斜线xie,反斜线fxie
bool xiaochou[N],xie[N],fxie[N];

void dfs(int u)//u表示遍历到数组第u行
{
    if(u==n)//当遍历到第n-1行时已经进行完成,等于n直接输出
    {
        for(int i=0;i<u;i++) puts(g[i]);
        puts("");
        return;
    }

    for(int i=0;i<n;i++)
    {
        if(!xiaochou[i]&&!xie[u+i]&&!fxie[n-u+i])//这里运用到一个数学知识,正对角线该点为u+i,其交叉对于的反对角线为n-u+i
        {
            g[u][i]='Q';
            xiaochou[i]=xie[u+i]=fxie[n-u+i]=true;
            dfs(u+1);
            xiaochou[i]=xie[u+i]=fxie[n-u+i]=false;//记得回溯
            g[u][i]='.';
        }
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++) g[i][j]='.';
    }
    dfs(0);
    return 0;
}

 2.第二种方式(一个格子一个格子去枚举判断,比较容易理解,但时间复杂度要大一点)

#include<iostream>
using namespace std;
const int N=20;
int n;
char g[N][N];
//由于国际象棋皇后的十字方向以及斜方向都能走,第二种方法就是把每个格子都枚举一遍
//设置row行数组,col列数组以及两个对角线数组,来判断皇后能不能放
bool row[N],col[N],xie[N],fxie[N];

void dfs(int x,int y,int s)//x和y分别表示枚举该数组到啥位置的行列坐标,s表示已经放了几个皇后
{
    if(y==n) y=0,x++;//每行列举完最后一列的时候,跳到下一行的第一列

    if(x==n)
    {
        if(s==n)
        {
            for(int i=0;i<n;i++) puts(g[i]);
            puts("");
        }
        return;
    }

    //不放皇后
    dfs(x,y+1,s);

    //放皇后
    if(!row[x]&&!col[y]&&!xie[x+y]&&!fxie[x-y+n])
    {
        g[x][y]='Q';
        row[x]=col[y]=xie[x+y]=fxie[x-y+n]=true;
        dfs(x,y+1,s+1);
        row[x]=col[y]=xie[x+y]=fxie[x-y+n]=false;
        g[x][y]='.';
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++) g[i][j]='.';
    }
    dfs(0,0,0);
    return 0;
}

难点总结:

这题需要补充的知识点就是关于对角线如何处理的问题,这里设置正对角线数组和反对角线数组来处理,正对角线为蓝色下标从左上角开始,反对角线为绿色下标从右上角开始,这里因为只要对角线中有一个皇后剩下的都不能放,所以可以看成一个bool类型的一维数组,而难处也在于bool数组的下标应该如何设置,

对于正对角线(如下图),规律就是其对角线格子横坐标加上纵坐标相等,因此代码中为x+y,

 

对于反对角线,为x-y+n,这里加n是为了不出现负数

 

 

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

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

相关文章

神经网络架构:最新进展和未来挑战

文章目录 1. 神经网络架构的演化历程1.1 感知机&#xff08;Perceptron&#xff09;1.2 多层感知机&#xff08;Multi-layer Perceptron&#xff0c;MLP&#xff09;1.3 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;1.4 循环神经网络&…

pwn学习(1)攻防世界-hello_pwn

下载链接&#xff1a; https://adworld.xctf.org.cn/challenges/list 主函数分析&#xff1a; 查看读入数据和比较数据的位置&#xff0c;会发现问题&#xff0c;他们是挨着的&#xff0c;且相差4个字节&#xff0c; 根据main()函数可以知道&#xff0c;dword_60106C是‘nua…

win10系统marven的安装与配置

一、安装jdk-8u191-windows-x64.exe 新建系统环境变量JAVA_HOME并配置Java搜索路径位置 二、下载apache-maven-3.9.4解压到C盘 https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.zip 三、新建环境变量MARVEN_HOME和添加搜索路径 四、查看版本…

十六、软连接?

1、软连接&#xff1a; 在Ubuntu中&#xff0c;可以使用“ln”命令来创建软链接。软链接&#xff08;symbolic link&#xff09;也叫软连接&#xff0c;类似于windows中的快捷方式&#xff0c;它是一个指向另一个文件或目录的符号链接。 2、基础语法&#xff1a; ln -s 被软…

【IMX6ULL驱动开发学习】11.Linux之SPI驱动

参考&#xff1a;驱动程序开发&#xff1a;SPI设备驱动_spi驱动_邓家文007的博客-CSDN博客 目录 一、SPI驱动简介 1.1 SPI架构概述 1.2 SPI适配器&#xff08;控制器&#xff09;数据结构 1.2 SPI设备数据结构 1.3 SIP设备驱动 1.4 接口函数 二、SPI驱动模板 一、SPI驱动…

cortex-A7核PWM实验--STM32MP157

实验目的&#xff1a;驱动风扇&#xff0c;蜂鸣器&#xff0c;马达进行工作 目录 一&#xff0c;PWM相关概念 有源蜂鸣器和无源蜂鸣器 二&#xff0c;分析电路图&#xff0c;框图 三&#xff0c;分析RCC章节 1&#xff0c;确定总线连接 2&#xff0c;根据总线内容确定基…

经管博士科研基础【4】排队论M/M/1公式

公式来源于B站睿智小课堂&#xff1a; 上面的公式要学会推导&#xff0c;具体推导过程也要学习一下【可见B站睿智小课堂】 具体推导思路是&#xff1a; 【1】先求解得到系统的队长L&#xff1a;这需要用到马尔科夫排队过程的相关知识&#xff0c;也就是说仅仅在排队过程是马尔…

docker使用harbor进行镜像仓库管理演示以及部分报错解决

目录 一.安装harbor和docker-compose 1.下载 2.将该文件修改为这样&#xff0c;修改好自己的hostname和port&#xff0c;后文的用户和密码可以不改也可以改&#xff0c;用于登录 3.安装 二.修改daemon.json文件和/etc/hosts文件 三.使用powershell作windows端域名映射 四…

基于JAYA算法优化的BP神经网络(预测应用) - 附代码

基于JAYA算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于JAYA算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.JAYA优化BP神经网络2.1 BP神经网络参数设置2.2 JAYA算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)

文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后&#xff0c;一鼓作气&#xff0c;把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…

从0到1学会Git(第一部分):Git的下载和初始化配置

1.Git是什么: 首先我们看一下百度百科的介绍:Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 …

4.9 已建立连接的TCP,收到SYN会发生什么?

1. 客户端的 SYN 报文里的端口号与历史连接不相同 此时服务端会认为是新的连接要建立&#xff0c;于是就会通过三次握手来建立新的连接。 旧连接里处于 Established 状态的服务端最后会怎么样呢&#xff1f; 服务端给客户端发消息了&#xff1a;客户端连接已被关闭&#xff…

Ant Design Vue 日期选择器DatePicker传给后台日期参数格式问题

花了一个下午才解决&#xff0c;官方组件文档里面是没有处理方案说明的。 项目版本&#xff1a;Ant Design Vue 2.0.2 前端部分代码&#xff1a; <template><a-modal:visible"visible":width"windowWidth":height"800":title"tit…

【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

阅读导航 前言一、继承的概念及定义1. 继承的概念2.继承的定义⭕定义格式⭕继承关系和访问限定符⭕继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承⭕单…

数据库为什么使用B+树而不是B树做索引

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

代码随想录训练营二刷第三天 | 203.移除链表元素 707.设计链表 206.反转链表

代码随想录训练营二刷第三天 | 203.移除链表元素 707.设计链表 206.反转链表 一、203.移除链表元素 题目链接&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/ 思路&#xff1a;使用虚拟头结点&#xff0c;两个指针&#xff0c;一个是遍历指针&#x…

基于微信小程序的餐厅预订系统的设计与实现(论文+源码)_kaic

摘 要 随着消费升级&#xff0c;越来越多的年轻人已经开始不再看重餐饮等行业的服务&#xff0c;而是追求一种轻松自在的用餐、购物环境。因此&#xff0c;无人餐厅、无人便利店、无人超市等一些科技消费场所应势而生。餐饮企业用工荒已成为不争的事实。服务员行业的低保障、低…

算法笔记(二):二分查找

二分查找 1、基础版 public static int binarySearch(int[] a, int target) {int i 0, j a.length - 1;while (i < j) {int m (i j) >>> 1;if (target < a[m]) { // 在左边j m - 1;} else if (a[m] < target) { // 在右边i m 1;} else {return m…

用正则处理Unicode 编码的文本

Unicode&#xff08;中文&#xff1a;万国码、国际码、统一码、单一码&#xff09;是计算机科学领域里的一项业界标准。它对世界上大部分的文字进行了整理、编码。Unicode 使计算机呈现和处理文字变得简单。 现在的 Unicode 字符分为 17 组编排&#xff0c;每组为一个平面&…

前端工程化之规范化

规范化是我们践行前端工程化中重要的一部分。 为什么要有规范化标准 俗话说&#xff0c;无规矩不成方圆&#xff0c;尤其是在开发行业中&#xff0c;更是要有严谨的工作态度&#xff0c;我们都知道大多数软件开发都不是一个人的工作&#xff0c;都是需要多人协同的&#xff0…