DFS奇偶剪枝
HDU1010题,无线TLE;百度一下学习了奇偶剪枝;
开始:
从一个点(x,y)到达终点(ex,ey)的最短距离是S
无论S是奇数还是偶数,要想到达终点的任意方案数中,路径长度一定是S+extra,extra必须为偶数(画几遍图没找到奇数画法);
好像可以用于BFS,这个还没用过;
就HDU1010题,当前已经走过time秒,总的时间为t秒;剩余时间为t-time秒
t-time=S+extra
已知S,t,time求extra(偶数)
开始剪枝:
1、extra不是偶数可以剪枝(规定时间到不了终点)
2、extra小于0也到不了终点
举例:
3 5 8
S. . . .
. . . . .
. . . . D
t=8
刚开始是extra=8-0-2-4=2(偶数可以)
如果t=7
刚开始是extra=7-0-2-4=1(偶数不可以,永远到不了直接可以退出了)
void dfs(int x,int y,int time){
if(flag)return ;
if(time==t&&mp[x][y]=='D'){
flag=true;return ;
}
if(time>=t)return ;
int h=t-time-abs(x-ex)-abs(y-ey);
if(h<0||h&1)return ;
for(int i=0;i<4;i++){
ll xx=x+dir[i][0];
ll yy=y+dir[i][1];
if(check(xx,yy)){
vis[xx][yy]=true;
dfs(xx,yy,time+1);
if(flag)return ;
vis[xx][yy]=false;
}
}
}