Toggle navigation
科创
{{ getSearchSuggestionLabel(suggestion) }}
{{ part.text }}
查看更多
登录
 
注册
电波
论坛
专栏
应用
登录
注册
{{ getSearchSuggestionLabel(suggestion) }}
{{ part.text }}
查看更多
论坛
>
计算机科学
>
软件综合
文号
t29258
阅读
12876
回复
16
收藏
7
(原创)回溯法--4皇后问题
max
2010/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
0
全部
只看作者
max
作者
16年4个月前
IP:未同步
257189
1楼
一个解(0代表空,1代表有皇后)
0100
0001
1000
0010
头有点晕代码里的花括号可能有点问题,求检查。
加载全文
引用
评论
0
ltc
16年4个月前
IP:未同步
257192
2楼
不至于发这里吧,这种精典老题
加载全文
引用
评论
0
nhlijiaming
16年4个月前
IP:未同步
257199
3楼
想知道LS 1s最多能算多少皇后?
加载全文
引用
评论
0
max
作者
16年4个月前
IP:未同步
257200
4楼
鄙人不才啊,比不上各位大大那么好的高数功底,懂得那么高深的算法。。。所以只有这个简单的了。
加载全文
引用
评论
0
max
作者
16年4个月前
IP:未同步
257201
5楼
引用第3楼nhlijiaming于2010-09-11 22:50发表的 :
想知道LS 1s最多能算多少皇后?
这个要看运行的计算机了,还有多线程优化。
加载全文
引用
评论
0
nhlijiaming
16年4个月前
IP:未同步
257205
6楼
按noip的标准, 好像是P4 2.6G, 2G内存(空间限制128/256M), 单线程..
加载全文
引用
评论
0
lovehongkong
16年4个月前
IP:未同步
257206
7楼
不是八皇后吗?
加载全文
引用
评论
0
max
作者
16年4个月前
IP:未同步
257209
8楼
回答几位:
1.俺不玩NOIP。。。而且没有P4 2.6。。。
2.其实是N皇后问题。。。4个8个都可以。
加载全文
引用
评论
0
lovehongkong
16年4个月前
IP:未同步
257211
9楼
来个46万皇后吧。。
加载全文
引用
评论
0
ltc
16年4个月前
IP:未同步
257257
10楼
ls确定有解??
加载全文
引用
评论
0
lovehongkong
16年4个月前
IP:未同步
257422
11楼
求有无解也可以。。
话说这个能cuda吗
加载全文
引用
评论
0
ltc
16年4个月前
IP:未同步
257482
12楼
ls给个算法,回溯不timeout就见鬼了
加载全文
引用
评论
0
begun
16年4个月前
IP:未同步
258336
13楼
对于这种数组,和我们数学上的数组有些差异啊。
空棋盘时这个棋盘是四方对称的。
放第一个皇后的时候,只需判断1/4个象限(包括中心轴)。
第二个皇后,如果皇后1在中心点上,那么同样四方对称,只需穷举其1/4位置。
如果在轴上,那变成左右对称。这样要再对对称轴一半进行判断。
打破了对称性后才需要全部穷举。
你每次放入一个皇后,都可能形成对称条件,都能获得减少穷举次数的机会。当然,如果是2个以上形成对称条件,可以肯定不符合要求,也不需要再去穷举了。这样可以算的快一些。
不过还是第一次放可以减少的计算次数比较明显(大约缩短了总计算次数的75%)。之后的次数可以忽略。
加载全文
引用
评论
0
phpskycn
16年3个月前
IP:未同步
260014
14楼
4皇后、8皇后肯定有解,LZ已经给出了。位置在分别在各行的2、4、1、3号位置上。如果是针对N皇后(N为变量)设计的,最好加上异常处理,并新建子线程防止整个程序挂掉。
加载全文
引用
评论
0
talenth1
15年11个月前
IP:未同步
276759
15楼
大家看看usaco的第一张最后一题就知道怎么优化了。18个后可以跑进2s
加载全文
引用
评论
0
全部
只看作者
在列表中查看
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
编辑
删除
{{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
保存
取消
我也是有底线的
保存中...
保存