hdu1010

n可以把map看成这样:
n0 1 0 1 0 1
n1 0 1 0 1 0
n0 1 0 1 0 1
n1 0 1 0 1 0
n0 1 0 1 0 1
n从为 0 的格子走一步,必然走向为 1 的格子
n从为 1 的格子走一步,必然走向为 0 的格子
n即:
n 0 ->1或1->0必然是奇数步
n 0->0 走1->1必然是偶数步
所以当遇到从 0 走向 0 但是要求时间是奇数的,或者, 从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n,m,T,sx,sy,dx,dy,flag;
char maze[8][8];
int px[4]={-1,1,0,0};
int py[4]={0,0,-1,1};
void dfs(int x,int y,int t)
{

    int nx,ny;
    int temp=t-abs(dx-x)-abs(dy-y);
    //cout<<temp<<endl;
    if(t==0&&x==dx&&y==dy)
    {
        flag=1;
    }
    if(flag)return;
    if(temp<0||temp&1)return;
    //cout<<x<<","<<y<<","<<t<<endl;

    else for(int i=0;i<4;i++)
    {
        nx=x+px[i];
        ny=y+py[i];
        if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]!='X')
        {
            maze[nx][ny]='X';
            dfs(nx,ny,t-1);
            maze[nx][ny]='.';
        }
    }
    return;
}

int main()
{
    //freopen("t.txt","r",stdin);
    while(scanf("%d%d%d",&n,&m,&T)&&(m+n+T))
    {
        flag=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s",maze[i]);
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(maze[i][j]=='S')
                {
                    sx=i;
                    sy=j;
                }
                else if(maze[i][j]=='D')
                {
                    dx=i;
                    dy=j;
                }
            }
        }
        maze[sx][sy]='X';
        dfs(sx,sy,T);
        if(flag)printf("YES\n");
        else printf("NO\n");
    }

    return 0;
}

你可能感兴趣的:(hdu1010)