qwe

#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int map[10][10];
int a,b,c,d,flag,i,j;
int n,m,t,count;
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; ///分别表示左、右、下、上四个方向
void DFS(int x,int y,int count)
{
    int k,p,q;
    if(x>n||y>m||x<1||y<1)
    {
        return ;
    }
    if(count==t&&x==c&&y==d)///时间正好才能逃生
    {
        flag=1;
        return ;
    }
    k=(t-count)-(abs(x-c)+abs(y-d))/*当前点到终点的最短路*/;///k为当前点到终点最短路还需要的时间差
    if(k<0||k&1)///k<0或者为奇数则不可能到达
    {
        return ;
    }
    for(i=0;i<4;i++)
    {
        p=x+dir[i][0];
        q=y+dir[i][1];
        if(map[p][q]!='X')
        {
            map[p][q]='X';
            count++;
            DFS(p,q,count);
            if(flag)
            {
                return ;
            }
            map[p][q]='.';///搜索不到则退出,重新将该点刷成。
        }
    }
    return ;
}
int main()
{
    int w;///墙的数量
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        w=0;
        if(n==0||m==0||t==0)
        {
            break;
        }
        getchar();
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%c",&map[i][j]);
                if(map[i][j]=='S')///记录狗的位置
                {
                    a=i;
                    b=j;
                }
                else if(map[i][j]=='D')///出口的位置
                {
                    c=i;
                    d=j;
                }
                else if(map[i][j]=='X')///墙的数量
                {
                    w++;
                }
            }
            getchar();
        }
        if(n*m-w<=t)///路径剪切,走完了不含墙的迷宫都还不到时间t,迷宫塌陷
        {
            printf("NO\n");
            continue;
        }
        flag=0;
        map[a][b]='X';///将狗的起始位置刷为x
        DFS(a,b,0);///这里的DFS函数是一个需要自身调用自身的递归函数,需要设置参数
        if(flag)
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/9326177.html
qwe
qwq
qwt
we
今日推荐