在学习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皇后问题的更多相关文章

  1. Java实现 蓝桥杯VIP 基础练习 2n皇后问题

    基础练习 2n皇后问题 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一 ...

  2. 【算法】蓝桥杯 试题 基础练习 Huffuman树

    资源限制 时间限制:1.0s   内存限制:512.0MB 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, ...

  3. Java实现 蓝桥杯VIP 基础练习 Huffuman树

    基础练习 Huffuman树 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Hu ...

  4. Java实现 蓝桥杯VIP 基础练习 时间转换

    问题描述 给定一个以秒为单位的时间t,要求用"h️s" 的格式来表示这个时间.H表示时间,M表示分钟,而s表示秒,它们都是整数且没有前导的"0".例如,若t=0 ...

  5. Java实现 蓝桥杯VIP 基础练习 字符串对比

    问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...

  6. Java实现 蓝桥杯VIP 基础练习 分解质因数

    题目介绍 问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1a2a3-(a1<=a2<=a3-,k也是从小到 ...

  7. Java实现 蓝桥杯VIP基础练习 矩形面积交

    描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入 输入仅包含两行,每行描述一个矩形. 在每行中,给出矩 ...

  8. Java实现 蓝桥杯VIP 基础练习 完美的代价

    package 蓝桥杯VIP; import java.util.Scanner; public class 完美的代价 { public static int sum = 0; public sta ...

  9. Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法

    问题描述 当输入12 3456 7009时,会给出相应的念法: 十二亿三千四百五十六万七千零九 用汉语拼音表示为 shi er yi san qian si bai wu shi liu wan qi ...

随机推荐

  1. BBN+

    目录 motivation settings results motivation 观测用BBN的模式训练出来的模型, 配上不同的\(\alpha\), 结果会如何. settings Attribu ...

  2. Chapter 13 Standardization and The Parametric G-formula

    目录 13.1 Standardization as an alternative to IP weighting 13.2 Estimating the mean outcome via model ...

  3. [Git]解决Permission denied, please try again问题

    在gitlab上传项目的时候出现Permission denied, please try again问题, 网上有很多解释,但是都没能解决我的问题,后来经过自己尝试成功了,这里把经验分享给大家. 在 ...

  4. emqx的acl.conf使用

    allow_anonymous=true就不说了,打开这个就像开了挂 现在讨论一下allow_anonymous=false,这样的话你会发现,client连接不上了 后来发现连接和权限 是两个事.. ...

  5. git中submodule子模块的添加、使用和删除

    git中submodule子模块的添加.使用和删除   原文链接:https://blog.csdn.net/guotianqing/article/details/82391665背景项目中经常使用 ...

  6. 04.python哈希表

    python哈希表 集合Set 集合,简称集.由任意个元素构成的集体.高级语言都实现了这个非常重要的数据结构类型. Python中,它是可变的.无序的.不重复的元素的集合. 初始化 set() -&g ...

  7. Mysql字符串字段判断是否包含某个字符串的方法

    方法一:like SELECT * FROM 表名 WHERE 字段名 like "%字符%"; 方法二:find_in_set() 利用mysql 字符串函数 find_in_s ...

  8. js 关于replace() 的使用心得

    1.前言 我想把一段话 let a = "抱歉,您当前的主治医生有紧急情况不得不下班,您的预约将由<br>医生:里斯<br>为您就诊,<br>诊室位置:门 ...

  9. STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  10. kafka学习笔记(五)kafka的请求处理模块

    概述 现在介绍学习一下kafka的请求处理模块,请求处理模块就是网络请求处理和api处理,这是kafka无论是对客户端还是集群内部都是非常重要的模块.现在我们对他进行源码深入探讨.当我们说到 Kafk ...