n皇后问题合集

article/2025/10/6 0:56:25

八皇后问题是dfs的经典问题,目前遇到过的类型大致有这么几种:

对角线.png

1.经典n皇后问题

题目描述

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

输入格式

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

输出格式

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

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

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

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

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

输入样例

4

输出样例

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

分析

设置三个数组 col[N],dg[N],udg[N]; 判断每一列,每一个对角线,反对角线上是否放了皇后。

C++ 代码

#include<bits/stdc++.h>
using namespace std;const int N = 20;int n;
char path[N][N];
bool col[N],dg[N],udg[N];
void dfs(int x)
{if(x == n){for(int i=0;i<n;i++) {printf("%s\n",path[i]);}printf("\n");return ; }for(int i=0;i<n;i++){if(!col[i] && !dg[x+i] && !udg[n-x+i]){path[x][i]='Q';col[i]=dg[x+i]=udg[n-x+i] = true;dfs(x+1);path[x][i]='.';col[i]=dg[x+i]=udg[n-x+i] = false;}}
}
int main()
{cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){path[i][j]='.';}}dfs(0);return 0;} 

2.八皇后

题目描述

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。

如何将 8 个皇后放在棋盘上(有 8×8 个方格),使它们谁也不能被吃掉!

这就是著名的八皇后问题。

对于某个满足要求的 8 皇后的摆放方法,定义一个皇后串 a 与之对应,即 a=b1b2…b8,其中 bi 为相应摆法中第 i 行皇后所处的列数。

已经知道 8 皇后问题一共有 92 组解(即 92 个不同的皇后串)。

给出一个数 b,要求输出第 b 个串。

串的比较是这样的:皇后串 x 置于皇后串 y 之前,当且仅当将 x 视为整数时比 y 小。

输入格式

第一行包含整数 n,表示共有 n 组测试数据。

每组测试数据占 1 行,包括一个正整数 b。

输出格式

输出有 n 行,每行输出对应一个输入。
输出应是一个正整数,是对应于 b 的皇后串。

输入样例

2
1
92

输出样例

15863724
84136275

分析

由题意可得,一共存在92中合法性情况,所以只需要将这92次都先存储在结果数组中,之后直接输出即可。

C++ 代码

#include<bits/stdc++.h>
using namespace std;
const int N =20;
bool col[N],dg[N],udg[N];
int n,x;
vector<string> path;
void dfs(int u,string s)
{if(u==8){path.push_back(s);return ;}for(int i=0;i<8;i++){if(!col[i] && !dg[u+i] && !udg[u-i+8]) {col[i]=dg[u+i]=udg[u-i+8]=1;s+=(i+'1');dfs(u+1,s);s.pop_back();col[i]=dg[u+i]=udg[u-i+8]=0;}}
}
int main()
{dfs(0,"");sort(path.begin(),path.end());cin>>n;while(n--){cin>>x;cout<<path[x-1]<<endl;}return 0;
}

3.八皇后*改

题目描述

规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。

输入格式

一个8*8的棋盘。
数据规模和约定
棋盘上的数字范围0~99

输出格式

所能得到的最大数字和

输入样例

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

输出样例

260

分析

由经典八皇后问题可得,一共存在92中合法性情况,所以只需要将这92次的结果取最大值就可以了。

C++ 代码

#include<bits/stdc++.h>
using namespace std;
int ans,g[10][10];
bool col[10],dg[20],udg[20];
void dfs(int u,vector<int> v)
{if(u==8){int res=0;for(int i=0;i<8;i++){res+=g[i][v[i]];}ans=max(res,ans);}for(int i=0;i<8;i++){if(!col[i] && !dg[u+i] && !udg[u-i+8]){col[i]=dg[u+i]=udg[u-i+8]=1;v.push_back(i);dfs(u+1,v);v.pop_back();col[i]=dg[u+i]=udg[u-i+8]=0;}}
}
int main()
{for(int i=0;i<8;i++){for(int j=0;j<8;j++)cin>>g[i][j];}vector<int> v;dfs(0,v);cout<<ans;return 0;
}

4.2n皇后问题

题目描述

给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。

问总共有多少种放法?

n小于等于8。

说明:同一条对角线是指包括两条主对角线的所有对角线,n=5时的棋盘从左上往右下有9条对角线,从右上往左下也有9条对角线。

比如,棋盘为:

1 1 1 1

1 1 1 1
1 1 1 1
1 1 1 1

表示一个4*4的棋盘,所有位置都可放皇后。

则可知有2种放法。

输入格式

输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

输出格式

输出一个整数,表示总共有多少种放法。

输入样例

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

输出样例

0

分析

本题与八皇后*改题目类似,不过要进行两次皇后摆放,一次摆黑色皇后(染色为2),一次摆白色皇后(染色为3),最后判断是否所有的n个黑皇后和n个白皇后都摆在了正确的位置上,若正确,就算作一次合法样例,ans++。

C++ 代码

#include<bits/stdc++.h>
using namespace std;
const int N = 10;
bool colb[N],dgb[N*2],udgb[N*2],colw[N],dgw[N*2],udgw[N*2];
int n,g[N][N],cntb,cntw,ans;
void dfsw(int u,int color) //后给白色皇后摆放染色
{if(u==n)    //摆完了判断是否为合法方案{if(cntb==n && cntw==n) ans++;return ;}for(int i=0;i<n;i++){if(!colw[i] && !dgw[u+i] && !udgw[u-i+n] && g[u][i]==1){colw[i]=dgw[u+i]=udgw[u-i+n]=1;int t=g[u][i];g[u][i]=3;cntw++;dfsw(u+1,3);cntw--;g[u][i]=t;colw[i]=dgw[u+i]=udgw[u-i+n]=0;}}}
void dfsb(int u,int color)  //先给黑色皇后摆放染色
{if(u==n)    //摆完了黑色就摆白色{dfsw(0,3);return ;}for(int i=0;i<n;i++){if(!colb[i] && !dgb[u+i] && !udgb[u-i+n] && g[u][i]==1){colb[i]=dgb[u+i]=udgb[u-i+n]=1;int t=g[u][i];g[u][i]=2;cntb++;dfsb(u+1,2);cntb--;g[u][i]=t;colb[i]=dgb[u+i]=udgb[u-i+n]=0;}}
}
int main()
{cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>g[i][j];}}dfsb(0,2);cout<<ans;return 0;
}

5.王、后传说

题目描述

地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、竖、斜线位置。

看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。

所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死…

现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王位于王宫的边缘,占用的格子可能不到9个)。当然,皇后也不会攻击国王。

现在知道了皇宫的规模n,国王的位置(x,y)(国王位于第x行第y列,行和列号从1开始),请问,有多少种方案放置n个皇后,使她们不能互相攻击(同一横线、竖线、斜线上只能有一个皇后)。

输入格式

输入仅一行,包含三个整数,表示皇宫的规模n(n<=12)及国王的位置x和y坐标。

输出格式

一个整数,表示放置n个皇后的方案数

输入样例

8 2 2

输出样例

10

分析

本题属于棋盘有限制的皇后问题,国王所在的九宫格可以提前标记为1,不能防置,其他位置可以随便摆放皇后,如果摆到最后一行发现正好摆好了n个皇后,则属于一种合法情况。

C++ 代码

#include<bits/stdc++.h>
using namespace std;
const int N=30;
int n,a,b,cnt,ans;
bool col[N],dg[N],udg[N],st[N][N];
void dfs(int u)
{if(u==n)	//摆到最后刚好n个皇后{if(cnt==n) ans++;return ;}for(int i=0;i<n;i++){if(!col[i] && !st[u][i] && !dg[u+i] && !udg[u-i+n])	//此地可以摆皇后{col[i]=dg[u+i]=udg[u-i+n]=1;cnt++;dfs(u+1);cnt--;col[i]=dg[u+i]=udg[u-i+n]=0;}}
}
int main()
{cin>>n>>a>>b;a--,b--;	//题目从1~n,我们默认0~n-1,坐标偏移一下for(int i=-1;i<=1;i++)	//把皇帝的地盘提前标记好{for(int j=-1;j<=1;j++){int x=a+i,y=b+j;if(x>=0 && x<n && y>=0 && y<n) st[x][y]=1;}}dfs(0);cout<<ans;return 0;
}

http://chatgpt.dhexx.cn/article/gEr3ubVP.shtml

相关文章

N皇后问题(c语言实现)

问题描述&#xff1a; 有一个n*n的棋盘&#xff0c;在这个棋盘中放n个皇后&#xff0c;使得这n个皇后&#xff0c;任意两个皇后不在同一行&#xff0c;同一列&#xff0c;同一条对角线。例如&#xff0c;当n等于4时&#xff0c;有两种摆法。 输入只有一个整数n。 思路 如果…

N皇后问题

问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 上图为 8 皇后问题的一种解法。 给定一个整数 n&#xff0c;返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案&#…

回溯算法之N皇后问题

问题描述 什么是皇后问题(有一定了解可以直接跳过这个部分看求解部分哦) 八皇后问题&#xff08;英文&#xff1a;Eight queens&#xff09;&#xff0c;是由国际西洋棋棋手马克斯贝瑟尔于1848年提出的问题&#xff0c;是回溯算法的典型案例。 问题表述为&#xff1a;在88格的…

N皇后问题(分支限界法)

问题描述&#xff1a; 在 n * n 格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题等价于在 n * n 的棋盘上放置 n 个皇后&#xff0c;任何 2个皇后不放在同一行或同一列或同一斜线上…

N皇后问题详解

文章目录 一、题目描述二、题目解析&#xff08;1&#xff09;思考一(集合回溯)&#xff08;2&#xff09;思考二(数组深度递归)&#xff08;3&#xff09;思考三(位运算) 一、题目描述 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后&#xff0c; 要求&#xff1a;任何两个皇…

3.2 回溯法—N皇后问题

1. 问题描述 在 n n n\times n nn的棋盘上摆放 n n n个皇后&#xff0c;使任意两个皇后都不能处于同一行、同一列或同一斜线上 2. 问题分析 下以求解4皇后问题为例&#xff0c;分析4皇后问题的排列树以及回溯过程&#xff1a; 搜索及回溯过程&#xff1a; 解空间树&#…

【经典算法】N皇后问题

✨前言✨ N皇后问题经典的解决方案是暴力递归&#xff0c;其时间复杂度是O(2^n),因此常用来测试计算机的算力。今天我会给大家带来经典方法的详解&#xff0c;也会给大家展示N皇后优化后的大神解法。做一道经典题目&#xff0c;来一场思维旅行。 目录 ✨前言✨ &#x1f4a1;…

n皇后问题(回溯法)(超易理解)(详细注释)

问题&#xff1a; N皇后问题是一个经典的问题&#xff0c;描述如下&#xff1a; 在的方格棋盘需要放置N个皇后&#xff0c;使得它们不相互攻击&#xff0c; 即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45度角的斜线上。 对于给定的N…

n皇后问题(回溯法)

目录 1.问题描述 2.问题分析 3.完整源码 1.问题描述 八皇后问题是十九世纪著名的数学家高斯于1850年提出的。问题是:在88的棋盘上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。可以把八皇后问题扩展到n皇后问…

【浏览器跨域】跨域访问接口浏览器怎么设置?

window系统 1、右键浏览器&#xff0c;点击属性 2、找到目标&#xff0c;目标输入框内容最后面加上 --disable-web-security --user-data-dirC:\MyChromeDevUserData&#xff0c;–user-data-dir 3、点击确定 4、重新打开浏览器即可 mac系统 终端输入&#xff0c;重新打开浏…

AJAX跨域访问(不同域之间相互访问)

目录 一、跨域&#xff1a;二、同源策略&#xff1a;三、解决Ajax跨域问题的方案&#xff1a;方案一&#xff1a;设置响应头方案二&#xff1a;jsonp方案三&#xff1a;jQuery封装jsonp方案四&#xff1a;代理机制&#xff08;httpclient&#xff09;方案五&#xff1a;nginx反…

nginx配置图片跨域访问

在server段中添加红框内的图片跨域内容 参数 location ~* .*.(gif|jpg|jpeg|png|bmp|swf)$ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS…

浏览器跨域访问限制

一.什么是跨域 广义的跨域&#xff1a; (1) 资源跳转&#xff1a;A链接、重定向、表单提交 (2) 资源嵌入&#xff1a;<link>、<script>、<img>、<frame>等dom标签&#xff0c;还有样式中background:url()、font-face()等文件外链 (3) 脚本请求&#x…

Django 多方式实现跨域访问

一、什么是跨域 1.1 跨越介绍 跨域&#xff0c;是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript实施的安全限制。 这里说明一下&#xff0c;无法跨域是浏览器对于用户安全的考虑&#xff0c;如果自己写个没有同源策略的浏览…

Flask中跨域访问的实现

在我们访问不同的服务器时&#xff0c;就会涉及到了跨域的问题。因为不同域名之间是无法进行交流的&#xff0c;然后跨域就打破了这种规则的限制。说起Flask中的跨域&#xff0c;就不得不提到CORS组件了&#xff0c;相信大家在其它框架中也见过了它的身影。下面我们就跨域问题和…

Tomcat设置允许跨域访问

开发React项目时前端通过axios向后端代码发起请求调试的时候由于后端代码运行在8080端口而React项目运行在3000端口导致浏览器的同源策略禁止跨域请求&#xff0c;因此需修改Tomcat配置文件web.xml以开放跨域访问。 在tomcat的web.xml文件末尾加上&#xff1a; <filter>…

express 允许跨域访问

设置Express const express require(express) const bodyParser require(body-parser)const app express() // 处理参数 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }));// 设置允许跨域访问该服务 app.all(*, function (req, res, nex…

tomcat 设置允许跨域访问

既然想到使用tomcat进行跨域的设置&#xff0c;而不使用在项目中设置header来解决&#xff0c;说明你也是tomcat 下的资源需要做跨域处理吧&#xff1f;这也是一个统一的允许跨域设置&#xff0c;tomcat下的所有请求都将放开&#xff0c;请注意。 具体步骤&#xff1a; 1.首先…

Chrome浏览器 设置跨域访问

由于浏览器的安全策略&#xff0c;不同域名的访问会被限制&#xff0c;导致不能访问 chorme或者360都可以使用下列设置来解决这个问题&#xff1a; &#xff08;1&#xff09;在电脑上新建一个目录&#xff0c;例如&#xff1a;C:\MyChromeEnvUserData &#xff08;2&#x…

tomcat9配置允许跨域访问

目录 一、问题描述二、解决办法三、程序截图 一、问题描述 最近在用Tomcat9最新版本部署程序的时候&#xff0c;发现其他服务访问我的静态资源的时候出现了跨域访问&#xff0c;结果很明显被拦截了&#xff0c;之前的文章介绍了Tomcat8.5的跨域配置&#xff0c;但是研究发现&a…