E - Tempter of the Bone HDU - 1010

#include<stdio.h>
#include<stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;
char dp[100][100];
int start_x,start_y;
int end_x,end_y;
int time;
int n,m;
int first=0;
int num[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
//(abs(end_x-x)+abs(end_y-y)当前位置到终点的最短距离
//如果最短路径为x;那么到达目的地所走的长度的奇偶性一定和x一样
//注意开始的位置,只能待一次,以后都不能在待在那里了
void work(int x,int y,int second)
{
    if((abs(end_x-x)+abs(end_y-y))>time-second)
        return;
    if((abs(end_x-x)+abs(end_y-y))%2!=(time-second)%2)
       return;
    if(first)
        return;
    if(x==end_x&&y==end_y&&second==time)
    {
        first=1;
        return ;
    }
    if(second>time)   return;
    if(x==end_x&&y==end_y&&second<time-1)
    {

        return ;
    }
    for(int i=0; i<4; i++)
    {
        int x1=x+num[i][0];
        int y1=y+num[i][1];
        if(x1>0&&x1<=n&&y1>0&&y1<=m&&dp[x1][y1]!='X')
        {
            dp[x1][y1]='X';
            work(x1,y1,second+1);
            dp[x1][y1]='.';
        }
    }
    return ;
}
int main()
{
    while(~scanf("%d%d%d",&n,&m,&time)&&(n||m||time))
    {
        getchar();
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                scanf("%c",&dp[i][j]);
                if(dp[i][j]=='S')
                {
                    start_x=i;
                    start_y=j;
                    dp[i][j]='X';////注意开始的位置,只能待一次,以后都不能在待在那里了
                }
                if(dp[i][j]=='D')
                {
                    end_x=i;
                    end_y=j;
                    dp[i][j]='.';
                }
            }
            getchar();
        }
        first=0;
        work(start_x,start_y,0);
        if(first)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/zhangzhenjunaixuxin/article/details/81481042