HDU-1010 tempter of the bone 骨头的诱惑/233

调皮的狗子在一个神庙内发现了一根骨头,开心的捡起来走了,结果发现是陷阱。好吧,没事套路狗子干啥呢。狗子开始逃了,一秒钟狗子只可以上下或左右移动一格,当前所在格子下一秒就塌了,不可以停留或者回头。神庙大门只会在第T秒的时候开启,狗子要准点到达,不可以迟到或早到。

地图比较小,最大6x6,时间也只有50不到,这道题用深度搜索实现,应该不是很难吧,开始代码注释。

#include <iostream>
#include <cmath>
using namespace std;

int step,dx,dy,x,y;
int go[4][2]={{-1,0},{0,1},{1,0},{0,-1}};               //这个数组实现上下左右的移动
char map[8][8];

bool dfs(int nx,int ny,int rs)                          //deep first search 函数
{
    if(nx==dx&&ny==dy&&rs==step)                        //取一个点后,先确认是否为终点且时间是否恰好,门有不有打开
        return 1;
    int tmp=step-rs-abs(dx-nx)-abs(dy-ny);              //剪纸环节,总步数先减去已走步数、距终点横向和纵向距离。
    if(tmp<0||tmp%2)                                    //如果小于0,就是可能绕太多路了,放弃向这边走,余2不为0的话,我不是理解得很好,问学长也是说跟绕路有关,有什么理解的可以评论一下哦
        return 0;
    rs++;                                               //步数自增
    for(int i=0;i<4;i++)				//遍历四个方向
    {
        int xx=nx+go[i][0];
        int yy=ny+go[i][1];
        if(xx<0||xx>=x||yy<0||yy>=y||map[xx][yy]=='X')  //碰到墙停止
            continue;
        map[nx][ny]='X';				//走过的点标记为墙,防止再走导致死循环
        if(dfs(xx,yy,rs))				//递归,遍历其它点
            return 1;
        map[nx][ny]='.';				//遍历完成,返回时再复原地图
    }
    return 0;
}

int main()
{
    while(cin>>x>>y>>step)
    {
        if(x==0&&y==0&&step==0)
            return 0;
        int sx,sy;
        sx=9;sy=9;
        dx=9;dy=9;
        for(int i=0;i<x;i++)				//读取地图并且标注起始点
        {
            scanf("%s",&map[i]);
            for(int j=0;j<y;j++)
            {
                if(map[i][j]=='D')
                {
                    dx=i;
                    dy=j;
                }
                if(map[i][j]=='S')
                {
                    sx=i;
                    sy=j;
                }
            }
        }
        if((abs(dx-sx)+abs(dy-sy))>step)		//太远了,给的步数不可能走到,剪枝
        {
            cout<<"NO"<<endl;
            continue;
        }
        map[sx][sy]='X';
        if(dfs(sx,sy,0))				//遍历开始,根据返回值判断有不有走到
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}
感觉可以了,下次被问了我应该一眼就想起来了,哈哈哈


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章