蓝桥杯试题 基础练习 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 ...
随机推荐
- 【LeetCode】844. Backspace String Compare 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字符串切片 栈 日期 题目地址:https://le ...
- Special Prime
Special Prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Chapter 7 Confounding
目录 7.1 The structure of confounding Confounding and exchangeability Confounding and the backdoor cri ...
- uniapp云打包之后华为手机推送角标不显示(有推送没角标)
小米手机上有角标,华为和OPPO没有角标 解决方法: 华为手机添加权限(可通过反编译或者离线打包添加) < uses - permission android:name="com.hu ...
- vue从入门到精通之【vuex】(七)
vue从入门到精通之[vuex](七) vuex一个公用的大仓库,Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架. Vuex 实现了一个单向数据流,在全局拥有一个 state 存放数据, ...
- Spring练习,使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执行业务代码后释放资源,最后在控制台输出打印结果。
相关 知识 >>> 相关 练习 >>> 实现要求: 使用Properties类型注入方式,注入MySQL数据库连接的基本信息,然后使用JDBC方式连接数据库,模拟执 ...
- Java网络编程Demo,使用TCP 实现简单群聊功能Groupchat,创建一个服务端,使多个客户端都能收到消息
效果图: 开启服务端 客户端一 客户端二 客户端三 实现代码: 客户端类 import java.io.IOException; import java.net.ServerSocket; impor ...
- 编写Java程序,在子类老虎中重写父类动物的吃食方法
返回本章节 返回作业目录 需求说明: 在子类老虎中重写父类动物的吃食方法 实现思路: 在子类老虎中重写父类动物的吃食方法的实现思路如下: 创建各种动物的父类Animal类,在该类中定义eat()方法. ...
- 初识python: 异常处理
异常处理基本语法: try: pass except Exception,ex: pass 常用异常种类: AttributeError 试图访问一个对象,没有的属性.比如foo.x,但是foo没有属 ...
- django 修改模型中默认字段类型
在ADMIN页面实现一个密码框,模型中是CharField默认类型是textinput,实现方法是在admin.py中重写widgets. 来自为知笔记(Wiz)