当前位置:网站首页>递归法解决N皇后问题
递归法解决N皇后问题
2022-07-29 16:00:00 【封子墨】
N皇后问题
题目:
在一个n*n的棋盘上面放置n个皇后,要使得任意两个皇后之间不能相互攻击,规则是任意两个皇后处在同一行,同一列或者同一斜线的位置上时,能够相互攻击,皇后可以走任意步。

分析
通过分析题目可以知道,若使任意两个皇后都不能互相攻击,那么就必须使得任意两个皇后不能处在同一行,同一列,同一斜线即可(隐藏条件,皇后不能处在同一点),我们可以把棋盘看成一个n*n的等差坐标系,假设当一个皇后放在了(i,j)位置上时,那么i行,j列上的所有左边都不能再放置新的皇后,同时再所有的经过(i,j)点的斜线也是不能够放置皇后,行和列好解决,关键是如何解决斜线,因为再坐标系当中,任意点与其同一斜线上的点所构成的图形均为正方形,该斜线即为正方形的对角线,那么根据正方形的性质可知,其四条边相等,所以可以得到(记斜线上的某一点为(x,y)):(x-i)的绝对值=(y-j)的绝对值,所以这是能否放置皇后的充要条件。
#include<cstdio>
#include<cmath>
int sum=0;
bool pd(int i,int *a) {
if(i==0)
return true;//刚开始棋盘没有任何棋子,所以条件都满足
for(int k=0; k<i; k++) {
//不在同一列,同一对角线,因为使用了一维数组,每一行只占用一个位置,所以不在同一行隐含在了里面
if((a[k]==a[i])||(abs(i-k)==abs(a[i]-a[k])))
return false;
}
//条件满足,返回true代表当前位置可以放置
return true;
}
//输出
void print(int *a,int n) {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(j==a[i])
//一维数组中的数据代表再第几列,一维数组的下表代表在第几行
printf("@ ");//打印皇后棋子
else
printf("# ");//打印棋盘
}
printf("\n");
}
printf("\n");
}
int qj(int i,int *a,int n) {
for(int j=0; j<n; j++) {
a[i]=j;//当前位置放置棋子
if(pd(i,a)) {//判断是否满足
if(i==(n-1)) {//判断是否是棋盘的最后一行
print(a,n);//是的话,输出当前结果
sum++;//解法总数+1
} else
qj(i+1,a,n);//如果不是最后一行,则行数+1,递归继续执行
} else
//不满足像左移动一位,接着判断,因为一维数组是用来存放列左边的,所以j+1代表列+1
continue;
}
}
int main() {
int n;
scanf("%d",&n);
int a[n];//定义一维数组存放皇后的列坐标
qj(0,a,n);
printf("%d\n",sum);
}
边栏推荐
- [PCL study notes] Commonly used libraries and APIs for point cloud processing (PCL library Eigen)
- 如何破坏单例?我说了好几种方式,面试官:没想到你真会
- 2020年Mobileye收入近10亿美元,EyeQ芯片出货1930万颗
- 中芯国际:禁令后全力自救,设备等待期拉长,但没有客户“离开”
- SQL 开始日期、结束日期查询
- MySQL笔记下
- Contribution and writing required documents - OpenHarmony developer documentation style guide
- Recommended Remote Desktop Tools
- Flutter动态化 | Fair 2.6.0 新版本特性
- linux 安装mysql8.0 超详细教程(实战多次)
猜你喜欢

风格迁移篇----艺术风格转换的内容与风格解构

易基因:人类tRNA基因位点表现出与衰老相关的DNA高甲基化|研究文章

Easy Genes: Human tRNA loci exhibit DNA hypermethylation associated with aging | Research Article

ByteArrayOutputStream 类源码分析

分布式前修课:MySQL实现分布式锁

Alibaba 开源内网高并发编程手册

【微信小程序】组件使用及属性参考

linux 安装mysql8.0 超详细教程(实战多次)

面试突击69:TCP 可靠吗?为什么?

MLX90640 infrared thermal imager development notes (9)
随机推荐
How should small and medium-sized financial enterprises carry out disaster recovery construction?
传输层 TCP的连接管理-释放连接四次握手
上海移动基于亚信科技AntDB完成核心账务数据库的国产化替换
@RequestMapping注解最详细解析
国内EDA领导者芯和半导体完成最新一轮超亿元融资
浅谈程序的内存布局
双非渣渣的上岸之路!备战 60 天,三战滴滴侥幸收获 Offer
MySQL外键约束怎么创建
大规模线上应用TiDB会遇到的坑,本文都帮你排除好了
揭秘 | 2019 To B 年度盛宴那些人和那些事
面试突击69:TCP 可靠吗?为什么?
Moving forward steadily without forgetting the original intention, Volvo's sense of security comes from the public's recognition
最新!多交的税可以退,同学,你今天退税了吗?
Property (Property Animation Animation), the basic use of Butterknife butter knife
如何破坏单例?我说了好几种方式,面试官:没想到你真会
Recommended Remote Desktop Tools
生产者消费代码
任正非:华为绝不会出售终端手机业务!
PL5902 SOT-23-5 高效1MHz2A同步DC-DC降压调节器 百盛电子代理商
MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力