DFS奇偶剪枝

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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值