HDU1010 Tempter of the Bone(深搜+剪枝)

奇偶剪枝 奇数减去奇数是偶数,偶数减去偶数也是偶数,本题的一个剪枝用到这个技巧,就是,规定的步数与最短的步数 奇偶性相同的话,就可以规定的步数正好走到终点
在这里插入图片描述

//这道题需要大量的剪枝过程,少一个都可能会报错bn
/*
设起点坐标是bx,by;终点坐标是ex,ey;
最短路径是abs(bx-ex)+abs(by-ey)
但是我们可以很显然的看出来,无论是走,我们的步数肯定比最短路径数多一个偶数
所以,简化的第一点来了:如果题目中输入的步数比最短路径数多得是一个奇数,那么我们永远也不可能走到,所以直接输出NO;

步数大于给定 ,直接输出NO 

提前退出,避免超时。DFS是用递归实现的,那么如果我们找到了终点并且路数也符合,
不能只是让指示变量变值那么简单我们要在每次递归返回后面再加上一个判断,目的是终止查找;
如果不这样做,就算找到了结果是YES我们也必须等到整个图全部被扫描完才可以结束程序 
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char map[8][8],book[8][8];
int n,m,t,flag,a,b,c,d;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int step)
{
    if(map[x][y] == 'D'){
        if(step == t)
            flag = 1;
        return;
    }

    //剪枝过程,避免了大量运算
    int tmp = t - step - abs(c-x) - abs(d-y);
    if(tmp < 0 || tmp&1)
    {
        return;
    }
    if(step > t)
        return;

    for(int i=0;i<4;i++){
        int tx = x+dir[i][0];
        int ty = y+dir[i][1];
        if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]!='X'&&!book[tx][ty])
		{
			book[x][y]=1;
            dfs(tx,ty,step+1);
            if(flag)
                return;
            book[tx][ty]=0;
        }
    }
}
int main()
{
    while(cin>>n>>m>>t){
        if(n==0&&m==0&&t==0)
            break;

        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                cin>>map[i][j];
                if(map[i][j] == 'S')	//标记开始坐标 
                    a=i,b=j;
                if(map[i][j] == 'D')	//标记终止坐标 
                    c=i,d=j;
            }

        memset(book , 0, sizeof(book));
        flag = 0;
        dfs(a,b,0); 
        if(flag) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;

    }
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值