奇偶剪枝详解
以下内容转自等 百度百科:
奇偶剪枝是数据结构的搜索中,剪枝的一种特殊小技巧。
现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点,
s
| ||||
|
| ||||
|
| ||||
|
| ||||
+
|
—
|
—
|
—
|
e
|
如图所示(“|”竖走,“—”横走,“+”转弯),易证abs(ex-sx)+abs(ey-sy)为此问题类中任意情况下,起点到终点的最短步数,记做step,此处step1=8;
s
|
—
|
—
|
—
| |
—
|
—
|
+
| ||
|
|
+
| |||
|
| ||||
+
|
—
|
—
|
—
|
e
|
如图,为一般情况下非
最短路径的任意走法举例,step2=14;
step2-step1=6,偏移路径为6,偶数(易证);
结论
推广之,若 t-[abs(ex-sx)+abs(ey-sy)] 结果为非偶数(奇数),则无法在t步恰好到达;
返回,false;
反之亦反。
其实如果不能理解原理的话,能够记住结论也是不错的选择,这个结论的意思是说
给定T秒让到达,减去最短的路径,所多走的路程一定是一个偶数,原因是很简单,因为每横着或竖着多走,都必然要走回来,不可能一直偏下去,所以 * 2,是个偶数啦。
那么在hdu1010中的奇偶剪枝是如何利用的呢,下面解释一下》
给定时间为 t, 所已走的路程是step, 则其剪枝的两行代码是
t-step-(abs(ex-sx)+abs(ey-sy))<0
return 0;
t-step-(abs(ex-sx)+abs(ey-sy))是个奇数
return 0;
第一句中,如果等于0时,t-step相当于给定步数,因为步数常变的,而且每到一点都当做是起点,所以等于0时就已经是说明给定的步数和最短路一样了,不能再小了
第二句中,多余的步数是个偶数,所以是奇数肯定是错的嘛,哈哈,怎么样,会了吧