hdu--1010--DFS--奇偶性剪枝

http://blog.csdn.net/haley_java/article/details/9842123

奇偶剪枝分析:

可以把map看成这样: 
    0 1 0 1 0 1 
    1 0 1 0 1 0 
    0 1 0 1 0 1 
    1 0 1 0 1 0 
    0 1 0 1 0 1 
    从为 0 的格子走一步,必然走向为 1 的格子 
    从为 1 的格子走一步,必然走向为 0 的格子 
    即: 
     0 ->1或1->0 必然是奇数步 
     0->0 走1->1 必然是偶数步
     结论:
    所以当遇到从 0 走向 0 但是要求时间是奇数的,或者, 
    从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!

注意,这道题目是要恰好t时间到达,并不是在t时间内到达......

思路:剪枝+dfs

第一个剪枝我们可以想到,当剩下的步数大于剩下的时间的时候,狗是不能走到的;
 
接下来我们来第二个剪枝:
我们把map的奇偶性以01编号:
0 1 0 1 0 1 
1 0 1 0 1 0 
0 1 0 1 0 1 
1 0 1 0 1 0 
0 1 0 1 0 1 
我们发现从0走一步一定走到1,从1走一步一定走到0。
也就是说,如果当前的狗所在的坐标与D的坐标奇偶性不一样,那么狗需要走奇数步。
同理,如果狗所在坐标与D的坐标奇偶性一样,那么狗需要走偶数步数。
 
也就是说,狗的坐标x、y和对2取余是它的奇偶性,Dxy和对2取余是D的奇偶性。
两个奇偶性一加再对2取余,拿这个余数去与剩下时间对2取余的余数作比较即可。

 

   
   
   
   

奇偶剪枝

  是数据结构的搜索中,剪枝的一种特殊小技巧。   现假设起点为(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;    反之亦反。

 

 

 

你可能感兴趣的:(hdu--1010--DFS--奇偶性剪枝)