HDU 1010 Tempter of the Bone(パリティクリップ)

2069 ワード

/*
  : S D,   T    

        

    :
①    
②    scanf("%c", &c);   
*/

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int nMax = 8;
char map[nMax][nMax];
int visit[nMax][nMax];
int n, m, t;
int sx, sy, dx, dy;
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
int ans;

void dfs(int x, int y, int step)
{
    if(ans) return;
    if(x == dx && y == dy)
    {
        if(step == t)
            ans = 1;
        return;
    }
    if(step >= t)//④        ,    ,      t      
        return;
	int d = t - step - abs(x - dx) - abs(y - dy);//①    ,abs(x - dx) + abs(y - dy)   t - step     。         
	if(d < 0 || d % 2 != 0) return;//②d < 0   ,              
    int i;
    for(i = 0; i < 4; ++ i)
    {
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if(xx >= 0 && xx < n && yy >= 0 && yy < m && map[xx][yy] != 'X' && !visit[xx][yy])
        {
			visit[xx][yy] = 1;
            dfs(xx, yy, step + 1);
			visit[xx][yy] = 0;
        }
    }
}

int main()
{
    while(scanf("%d%d%d", &n, &m, &t) != EOF)
    {
        if(n == 0) break;
        int i, j;
        int sumWall = 0;
        for(i = 0; i < n; ++ i)
        {
			scanf("%s", map[i]);//    WA N  ,      scanf("%c", &c);
            for(j = 0; j < m; ++ j)
            {
                if(map[i][j] == 'S')
                    sx = i, sy = j;
                else if(map[i][j] == 'D')
                    dx = i, dy = j;
                else if(map[i][j] == 'X')
                    sumWall++;
            }
        }
        if(t >= n * m - sumWall)//③,        5、6   
        {
            printf("NO
"); continue; } ans = 0; memset(visit, 0, sizeof(visit)); visit[sx][sy] = 1; dfs(sx, sy, 0); printf("%s
", ans ? "YES" : "NO"); } return 0; }