当前位置:网站首页>DFS对剪枝的补充
DFS对剪枝的补充
2022-08-03 04:26:00 【真的没事鸭】
前面说过剪枝优化,一个是最优解剪枝,当前的路径不如最优解,这样就可以剪枝,一个是可行性剪枝,就是当前这个方案不合法,这样也可以剪枝。
所以这里通过八皇后问题来简单运用一下剪枝优化
经典案例-八皇后问题
n−n−皇后问题是指将 nn 个皇后放在 n×nn×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
现在给定整数 n,请你输出所有的满足条件的棋子摆法。
输入格式
共一行,包含整数 n。
输出格式
每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。
其中
.
表示某一个位置的方格状态为空,Q
表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。
注意:行末不能有多余空格。
输出方案的顺序任意,只要不重复且没有遗漏即可。
数据范围
1≤n≤9
输入样例:
4
输出样例:
.Q.. ...Q Q... ..Q. ..Q. Q... ...Q .Q..
思路
类似于搜索全排列,搜索顺序可以像全排列一样,每一行只能放一个皇后而且只能放一个皇后,所以我们可以像全排列一样枚举每一行皇后放在什么位置。
这里要注意剪枝,当我们把皇后放在某个位置时要判断是否有冲突,如果有冲突的话就不用往下搜了,这样剩下的搜索就不用执行了,这个过程就交剪枝。剪枝简单来说就是可以提前判断当前这个方案是不合法的,就没必要往下搜了,下面的子树就没用了,删掉直接回溯,这个过程就交剪枝。
这个怎么判断是否有冲突呢,题目要求每一行每一列和每一斜线上不能有重复放,那么就用这个条件来剪枝。
代码实现
#include <iostream>
using namespace std;
int n;
char p[20][20];
bool lie[20],dg[20],udg[20];//lie表示列是否用过,dg表示某条正对角线,udg表示某条反对角线
void dfs(int u)//u代表此时已经深入到第几行了
{
if(u==n)//如果u==n代表u已经搜索完最后一行 ,可以输出了
{
for(int i=0;i<n;i++)
cout<<p[i]<<endl;
cout<<endl;
return;
}
for(int i=0;i<n;i++)
//i表示列数,每次搜索第u行时从第一列开始搜,满足条件继续下一行的
//搜索,如果不满足条件则跳过继续搜索
//下面的dg[u+i]和udg[u+i]不太好理解
//u表示行数,i表示列数,u可以看成y,i看成x。根据判断某直线是否用过可以用截距判断。所以由
/*y=x+b->b=y-x即下标=u-i+n 表示某条正对角线,又因为表示下标必须是正数,
所以可以加上一个较大的正数,这里我们加上n */
//y=-x+b->b=y+x即下标=u+i 表示某条反对角线
{
if(!lie[i]&&!dg[u+i]&&!udg[u-i+n])//lie表示列是否用过,dg[u+i]表示某条正对角线是否用过,
//udg[u-i+n]表示某条反对角线是否用过
{
p[u][i]='Q';//如果此时可以填皇后,令此点为Q
lie[i]=dg[u+i]=udg[u-i+n]=1;
dfs(u+1);
lie[i]=dg[u+i]=udg[u-i+n]=0;//恢复现场
p[u][i]='.';
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
p[i][j]='.';
}
dfs(0);
return 0;
}
如有错漏之处,敬请指正。
边栏推荐
- The flink sql task is changed, and after adding several fields to the sql, an error occurs when restoring from the previously saved savepoint.
- 刚上线就狂吸70W粉,新型商业模式“分享购”来了,你知道吗?
- 4.深度学习的几何解释与梯度的优化
- rosbag工具plotjuggler无法打开rosbag的问题
- 1.一个神经网络示例
- CyberArk被评为2022年Gartner特权访问管理魔力象限领导者
- v-on指令:为元素绑定事件
- Mysql如何建立索引实现语句优化
- 社交电商如何做粉丝运营?云平台怎么选择商业模式?
- LeetCode算法日记:面试题 03.04. 化栈为队
猜你喜欢
数字化时代,企业如何建立自身的云平台与商业模式的选择?
打破传统电商格局,新型社交电商到底有什么优点?
OSI的分层特点、传输过程与三次握手、四次挥手、tcp与udp包头的描述
RequestContextHolder
DC-5靶场下载及渗透实战详细过程(DC靶场系列)
I ported GuiLite to STM32F4 board
Record some bugs encountered - when mapstruct and lombok are used at the same time, the problem of data loss when converting entity classes
传统企业如何转型社交电商,泰山众筹的玩法有哪些?
刚上线就狂吸70W粉,新型商业模式“分享购”来了,你知道吗?
荧光标记多肽FITC/AMC/FAM/Rhodamine/TAMRA/Cy3/Cy5/Cy7-Peptide
随机推荐
【Harmony OS】【ARK UI】Date 基本操作
Shell条件语句判断
数据库性能系列之索引(中)
MediaRecorder录制屏幕时在部分机型上报错prepare failed:-22
urlencode 和rawurlencode的区别
mysql bool blind
Dialog manager in the fourth chapter: the dialog message loop
DC-4靶场搭建及渗透实战详细过程(DC靶场系列)
阿里面试官:聊聊如何格式化Instant
让环境自己说话,论环境自描述的重要性
多肽介导PEG磷脂——靶向功能材料之DSPE-PEG-RGD/TAT/NGR/APRPG
2022 the first of the new league henan (4) : zhengzhou university of light industry G - maze
肖sir__自动化面试题
正则表达式与绕过案例
RequestContextHolder
「短视频+社交电商」营销模式爆发式发展,带来的好处有什么?
2022 Henan Mengxin League Game (4): Zhengzhou University of Light Industry E - Sleep Well
电子设备行业智能供应链系统:打破传统供应链壁垒,提升电子设备企业管理效能
redis键值出现 xacxedx00x05tx00&的解决方法
肖sir___面试就业课程____性能测试