蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题
在学习2n皇后之前,我们应该认识一下n皇后问题:
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
输入样例:
1
8
5
0
输出样例:
1
92
10
可以这么理解,以4皇后为例子:

现在剩下的问题是通过一些必要的操作使得这个算法的运算效率变高,这就是剪枝;
可以这样认为,设起始第一行第一列放皇后并设其坐标是(0,0),设放皇后的坐标为(i,j),为了避免重复,新皇后的坐标是(r,c),
可以看到:为了避免同列j!=c;
然后同行我们可以不用比较(因为我们是遵循着每一行只放一个皇后的原则摆放);
假设从放皇后的坐标到新皇后的坐标斜着走a步,那有新皇后坐标相对于皇后坐标来讲的话就有左上(i-r,j-c),左下(i-a,j+a),右下(i+a,j+a),右上(i+a,j-a),无论如何,都是|i-r|=|j-c|;
那为了满足题目要求就有|i-r|!=|j-c|;
题目就明确了,代码如下:
#include<bits/stdc++.h>
using namespace std;
int col[12]={0}; //col数组用于存放第i行第col[i]列放置皇后。
int n,tot = 0; //设置全局变量,即可不用投值,直接调用
bool check(int r,int c){ //判断新皇后是否和放好的皇后发生冲突。
for(int i=0;i<r;i++){
//这里不需要判断是否同行,因为我们设置的每行只投放一个皇后,所以不需要判断,只判断是否同列或者同斜线即可。
if((col[i]==c)||(abs(col[i]-c)==abs(i-r)))return false;
}
return true;
}
void dfs(int r){
if(r==n){ //因为从0开始,当行数r达到n时,表示已经完成了
tot++;
return ;
}
for(int c=0;c<n;c++){
if(check(r,c)){ //判断是否可以放置,可以便放置,否则剪枝。
col[r]=c;
dfs(r+1); //继续放置下一行的新皇后
}
}
}
int main(){
int ans[12]={0};
for(n=0;n<=10;n++){ //对n皇后进行打表,然后结果存入ans数组
memset(col,0,sizeof(col)); //每次要进行初始化
tot=0;
dfs(0); //DFS
ans[n]=tot; //存放
}
while(cin >> n){
if(n==0)return 0;
cout << ans[n] << endl;
}
return 0;
}
并且附上一个讲的很好的视频链接:https://www.bilibili.com/video/BV1bK4y1n7iq?spm_id_from=333.999.0.0
接下来就是2n皇后问题了,大体思路和n皇后问题差不多了,不同之处是需要判断能不能放皇后,那我们可以如下解决:
在放完了黑皇后(先放黑)在处理白皇后,其中如果没放完的话判断能不能放皇后这样一个问题,然后对于白皇后我们除了判断能不能放皇后的同时也要判断那个位置是不是被黑皇后占了
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;
int n;
int mapqueen[maxn][maxn]; //能不能放皇后
int whqueen[maxn]={0}; //白皇后位置
int blqueen[maxn]={0}; //黑皇后位置
int ans;
bool checkbl(int step,int c)
{
for(int i=1;i<step;i++)
{
if(blqueen[i]==c||(abs(blqueen[i]-c)==abs(i-step)))
return false;
}
return true;
}
bool checkwh(int step,int c)
{
for(int i=1;i<step;i++)
{
if(whqueen[i]==c||(abs(whqueen[i]-c)==abs(i-step)))
return false;
}
return true;
}
void dfs_white(int step)
{
if(step==n+1)
{
ans++;
}
for(int c=1;c<=n;c++)
{
if(blqueen[step]==c)
continue;
if(mapqueen[step][c]==0)
continue;
whqueen[step]=c;
if(checkwh(step,c))
{
dfs_white(step+1);
}
}
}
void dfs_black(int step)
{
if(step==n+1)
{
dfs_white(1);
}
for(int c=1;c<=n;c++)
{
if(mapqueen[step][c]==0)//第step行第i列是否放了皇后的条件
continue;
blqueen[step]=c;//在第step行第i列放黑皇后
if(checkbl(step,c))
{
dfs_black(step+1);//进入下一层
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&mapqueen[i][j]);
}
}
dfs_black(1);//从第一行开始搜黑皇后
printf("%d\n",ans);
return 0;
}
蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题的更多相关文章
- Java实现 蓝桥杯VIP 基础练习 2n皇后问题
基础练习 2n皇后问题 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一 ...
- 【算法】蓝桥杯 试题 基础练习 Huffuman树
资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, ...
- Java实现 蓝桥杯VIP 基础练习 Huffuman树
基础练习 Huffuman树 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Hu ...
- Java实现 蓝桥杯VIP 基础练习 时间转换
问题描述 给定一个以秒为单位的时间t,要求用"h️s" 的格式来表示这个时间.H表示时间,M表示分钟,而s表示秒,它们都是整数且没有前导的"0".例如,若t=0 ...
- Java实现 蓝桥杯VIP 基础练习 字符串对比
问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...
- Java实现 蓝桥杯VIP 基础练习 分解质因数
题目介绍 问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1a2a3-(a1<=a2<=a3-,k也是从小到 ...
- Java实现 蓝桥杯VIP基础练习 矩形面积交
描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入 输入仅包含两行,每行描述一个矩形. 在每行中,给出矩 ...
- Java实现 蓝桥杯VIP 基础练习 完美的代价
package 蓝桥杯VIP; import java.util.Scanner; public class 完美的代价 { public static int sum = 0; public sta ...
- Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
问题描述 当输入12 3456 7009时,会给出相应的念法: 十二亿三千四百五十六万七千零九 用汉语拼音表示为 shi er yi san qian si bai wu shi liu wan qi ...
随机推荐
- 【剑指Offer】二叉树的下一个结点 解题报告(Python)
[剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 前端项目 node8升级到node16,代码升级汇总
背景 公司的项目是vue项目,环境是node@8x版本的,最近我创建react hook的项目,发现至少需要node14才支持,打开官网才发现node都已经到16版本了.失策啊,失策.于是直接升级到最 ...
- IT6516替代方案|CS5212替代IT6516|CapstoneCS5212
IT6516/IT6516BFN:是一款DP显示端口转VGA转换器的嵌入式MCU单片机. IT6516/IT6516BFN结合DisplayPort接收器和三重DAC,通过转换功能支持DisplayP ...
- MySQL高级查询与编程笔记 • 【第2章 数据定义和操作】
全部章节 >>>> 本章目录 2.1 数据定义语言和数据操作语言 2.1.1 设计"优乐网"数据库 2.1.2 数据定义语言 2.1.3 数据操作语言 ...
- What's new in dubbo-go-pixiu 0.4.0
Dubbo-go-pixiu 是一款高性能 API 网关,支持 Dubbo 和 Http 等多种协议.具体介绍文章可以参考<Dubbo 跨语言调用神兽:dubbo-go-pixiu>. 近 ...
- Android 悬浮窗 System Alert Window
悬浮窗能显示在其他应用上方.桌面系统例如Windows,macOS,Ubuntu,打开的程序能以窗口形式显示在屏幕上. 受限于屏幕大小,安卓系统中主要使用多任务切换的方式和分屏的方式.视频播放,视频对 ...
- Jenkins_创建git任务(3)
jenkins创建git任务,需要使用插件 点击Manage Jenkins,点击Manage Plugins 点击Available搜索git,安装git plugin 进入项目管理界面,会有个Gi ...
- 初识python: 字符串常用操作
直接上代码示例: #!/user/bin env python # author:Simple-Sir # time:20180914 # 字符串常用操作 name = 'lzh lyh' print ...
- LINUX学习--nginx服务器的安装
一.安装环境 操作系统CentOS6.8 关闭SeLinux和iptables防火墙 二.网络yum源 将下面的软件下载到 /etc/yum.repos.d/ 的目录下 官方基础:http:// ...
- antd的table组件设置Column的width列宽度不生效问题
超长连续字段(长数字和长单词) 破坏表格布局的问题(即使你指定了列的宽度也会被挤开),之前组件内默认加过 word-break: break-word; 去纠正此类布局,又会引起其他的问题. 所以最好 ...