当前位置:网站首页>n皇后问题(回溯法)
n皇后问题(回溯法)
2022-08-02 03:28:00 【Aiolei】
1. 问题
在有 n*n 方格的棋盘中放置 n 个皇后,使得任何两个皇后之间不能相互攻击,即在同一行同一列不能有两个以上的皇后,在与主对角线、副对角线的平行线上也不能有两个以上的皇后,试给出所有的放置方法。
2. 分析
n 皇后问题是回溯法中的经典问题
我们可以选择逐行放皇后,先给第一行放皇后,很显然我们会把它放在第一列。接下来,给第二行放皇后,那么第二行的皇后能放在哪些位置呢?这时候需要一个判断函数 judge() 来判断第二列的皇后能放在哪里。
判断的条件就是:该行的皇后与前面已放置好的皇后的列数不能相同,并且还不能在同一主副对角线上。这里使用了数组 pos[] 来记录列数,即 row 表示行数, pos[row] 表示当前该行的列数。同列好判断,即i循环列数,只要不要 p o s [ i ] = = p o s [ r o w ] pos[i]==pos[row] pos[i]==pos[row] 即可;对角线判断可以使用绝对值,如果行数相减的绝对值等于列数相减的绝对值 a b s ( r o w − i ) = = a b s ( p o s [ r o w ] − p o s [ i ] ) abs(row-i)==abs(pos[row]-pos[i]) abs(row−i)==abs(pos[row]−pos[i]),那么两个皇后就在同一对角线上,不满足。
如果第二行找到放皇后的某一列,那么就进行第三行的摆放…
在放置皇后过程中,如果该行的所有列均不可放皇后,那么便回溯到上一行,重新选择放置皇后的位置,再进行下一行的操作。
3. 代码
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
int n, sum = 0; //皇后数量n
int pos[20]; //记录每个皇后应该放置的列数
//判断该位置能否放皇后
bool judge(int row)
{
for(int i = 1;i < row;i++){
//同列或同对角线上不能放皇后
if((pos[i]==pos[row]) || (abs(row-i)==abs(pos[row]-pos[i])))
return false;
}
//cout<<"行:"<<row<<",列:" <<pos[row]<<endl; //用于调试
return true;
}
//回溯法
void backtrack(int row)
{
if(row > n) //说明行数超出棋盘大小,已排好一次
sum++;
else{
for(int i = 1;i <= n;i++){
pos[row] = i; //目前是第row行第i列
if(judge(row)){
//能放置皇后则进入下一行
backtrack(row+1);
}
}
}
}
int main()
{
cout<<"输入皇后的数量 n = ";
cin>>n;
backtrack(1);
cout<<n<<"皇后有"<<sum<<"种解法!"<<endl;
return 0;
}
4. 效果
4皇后
8皇后
边栏推荐
猜你喜欢

《scala 编程(第3版)》学习笔记3

laravel-admin FROM表单同行展示问题

关于我的项目-微信小程序2(uniapp->wx小程序)

OpenCore 黑苹果安装教程

redo log与binlog间的破事

什么是广告电商商业模式?这几个门派告诉你
![[Hello World教程] 使用HBuilder和Uni-app 生成一个简单的微信小程序DEMO](/img/98/7ad7fcee0deaaa92446098d1d99dc3.png)
[Hello World教程] 使用HBuilder和Uni-app 生成一个简单的微信小程序DEMO

zsh: command not found: xxx 解决方法

C# 常用方法记录

Windows下MySQL数据库报“ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:8000‘ (10061)”错误解决
随机推荐
张量乘积—实验作业
广告电商「私域打工人」职业前景:你离月薪6万,还差多远?
如何在正则表达式里表达可能存在也可能不存在的内容?
gradle脚本中groovy语法讲解
Laravel随笔记录
2022年中高级 Android 大厂面试秘籍,为你保驾护航金九银十,直通大厂
centos8 安装搭建php环境
electron-builder打包不成功解决方法
面试必备:Android性能分析与优化实战进阶手册
机器学习预备知识
解决flex布局warp自动换行下最后一行居中问题
VS2017报错:LNK1120 1 个无法解析的外部命令
ffmpeg 有声视频合成背景音乐(合成多声音/合成多音轨)
如何一步一步的:玩转全民拼购!
3D建模作品
Nest 的实现原理?理解了 reflect metadata 就懂了
元宇宙:为何互联网大佬纷纷涉足?元宇宙跟NFT是什么关系?
Vision Transformer(ViT)论文精读和Pytorch实现代码解析
Go中的一些优化笔记,简约而不简单
C#从入门到精通