(原创)回溯法--4皇后问题
max2010/09/11软件综合 IP:上海
一、回溯法
回溯法是一种很低效的方法,有点类似穷举,需要尝试每一种可能,直到找到正确答案,或者尝试完所有的可能。
如果发现某一条路行不通,就往回走。使用回溯法前最好确定是可行的,且能在有限的时间内完成。
二、实例:四皇后问题
有一个4x4的棋盘,上面摆四个皇后,要求每个皇后都不能被攻击。
int pl[3][3] = {0};//建立二维一个数组作为棋盘
int state = 0;//记录状态
int p[3] = {0};//计数器
bool safe();//用这个函数检查是否有皇后会被攻击
void fe(){
if(state<3){
pl[p[state]][state] = 1;
int safe = safe();
if(safe == true){
state++;
}
else{
pl[p[state]][state] = 0;
if(p[state] == 3){
p[state]=0;
state++;
fe();
return;
}
else{
p[state]++;
fe();
return;
}
}
}
else{
return;
}
}
思路如下,先尝试每一行第一个位置,如果没问题,再尝试下一行,如果出了问题,改成下一个位置,如果本行已经尝试完,说明问题在上一行。
N皇后问题都可以参考这个,注意由于大量实验证明4皇后问题有解,所以没有对一些异常加以防范。
+100  科创币    joyeep    2010/09/11 鼓励讨论算法
来自:计算机科学 / 软件综合
16
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
max 作者
14年4个月前 IP:未同步
257189
一个解(0代表空,1代表有皇后)
0100
0001
1000
0010
头有点晕代码里的花括号可能有点问题,求检查。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ltc
14年4个月前 IP:未同步
257192
不至于发这里吧,这种精典老题
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
nhlijiaming
14年4个月前 IP:未同步
257199
想知道LS 1s最多能算多少皇后?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
max作者
14年4个月前 IP:未同步
257200
鄙人不才啊,比不上各位大大那么好的高数功底,懂得那么高深的算法。。。所以只有这个简单的了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
max作者
14年4个月前 IP:未同步
257201
引用第3楼nhlijiaming于2010-09-11 22:50发表的  :
想知道LS 1s最多能算多少皇后?
这个要看运行的计算机了,还有多线程优化。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
nhlijiaming
14年4个月前 IP:未同步
257205
按noip的标准, 好像是P4 2.6G, 2G内存(空间限制128/256M), 单线程..
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lovehongkong
14年4个月前 IP:未同步
257206
不是八皇后吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
max作者
14年4个月前 IP:未同步
257209
回答几位:
1.俺不玩NOIP。。。而且没有P4 2.6。。。
2.其实是N皇后问题。。。4个8个都可以。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lovehongkong
14年4个月前 IP:未同步
257211
来个46万皇后吧。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ltc
14年4个月前 IP:未同步
257257
ls确定有解??
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
lovehongkong
14年4个月前 IP:未同步
257422
求有无解也可以。。
话说这个能cuda吗
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ltc
14年4个月前 IP:未同步
257482
ls给个算法,回溯不timeout就见鬼了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
begun
14年4个月前 IP:未同步
258336
对于这种数组,和我们数学上的数组有些差异啊。

空棋盘时这个棋盘是四方对称的。

放第一个皇后的时候,只需判断1/4个象限(包括中心轴)。
第二个皇后,如果皇后1在中心点上,那么同样四方对称,只需穷举其1/4位置。
如果在轴上,那变成左右对称。这样要再对对称轴一半进行判断。
打破了对称性后才需要全部穷举。

你每次放入一个皇后,都可能形成对称条件,都能获得减少穷举次数的机会。当然,如果是2个以上形成对称条件,可以肯定不符合要求,也不需要再去穷举了。这样可以算的快一些。

不过还是第一次放可以减少的计算次数比较明显(大约缩短了总计算次数的75%)。之后的次数可以忽略。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
14年4个月前 IP:未同步
260014
4皇后、8皇后肯定有解,LZ已经给出了。位置在分别在各行的2、4、1、3号位置上。如果是针对N皇后(N为变量)设计的,最好加上异常处理,并新建子线程防止整个程序挂掉。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
talenth1
14年0个月前 IP:未同步
276759
大家看看usaco的第一张最后一题就知道怎么优化了。18个后可以跑进2s
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}