文号
t29258
阅读
12878
回复
16
收藏
7
(原创)回溯法--4皇后问题
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
鼓励讨论算法
max作者
16年4个月前IP:未同步
257189
1楼
一个解(0代表空,1代表有皇后)
0100
0001
1000
0010
头有点晕代码里的花括号可能有点问题,求检查。
引用
评论
max作者
16年4个月前IP:未同步
257200
4楼
鄙人不才啊,比不上各位大大那么好的高数功底,懂得那么高深的算法。。。所以只有这个简单的了。
引用
评论
max作者
16年4个月前IP:未同步
257201
5楼
引用第3楼nhlijiaming于2010-09-11 22:50发表的  :
想知道LS 1s最多能算多少皇后?
这个要看运行的计算机了,还有多线程优化。
引用
评论
max作者
16年4个月前IP:未同步
257209
8楼
回答几位:
1.俺不玩NOIP。。。而且没有P4 2.6。。。
2.其实是N皇后问题。。。4个8个都可以。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的