#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<iostream>
const int maxn = 10;
int map[maxn][maxn] ;
int visted[maxn][maxn] ;
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; //分别表示下、上、左、右四个方向 x 行坐标 y 列坐标
int startx,starty,endx,endy,n,m,wall,T;
bool flag ;
bool isSave(int x,int y) //看走的是否安全
{
    if(x>=0 && x < n && y >=0 && y < m)
        return true;
    return false;
}
void dfs(int x,int y,int cnt)
{
    if(cnt > T)
        return ;
    if(x == endx && y ==endy && cnt ==T)
    {
        flag = true;
        return ;
    }
    int i,newx,newy;
    
    
    for(i = 0; i < 4; i ++ )
    {
        newx = x + dir[i][0],newy = y + dir[i][1];
        if(isSave(newx,newy) && map[newx][newy] &&!visted[newx][newy] )
        {
            visted[newx][newy] = 1;
            dfs(newx,newy,cnt+1);
            if(flag) return;
            visted[newx][newy] = 0;
        }
    }
    
}
int main()
{
    int i,j;
    char ch;
    while(scanf("%d%d%d",&n,&m,&T),n||m||T)        
    {
        memset(visted,0,sizeof(visted));
        memset(map,0,sizeof(map));
        wall = 0;
        flag = false;
        getchar();
        for(i = 0; i < n; i ++)
        {
            for(j = 0; j < m; j++)
            {
                scanf("%c",&ch);
                if(ch == 'S')
                    startx = i,starty=j;
                else if(ch == 'D' )
                    endx = i,endy=j ,map[i][j] = 1;//门也是可走点
                else if( ch=='X' ) wall++;
                else
                    map[i][j] = 1;
            }
            getchar();
        }
        int temp = T - abs(startx-endx) - abs(starty-endy);
        
        if( temp<0 || temp%2==1 ) printf("NO\n");
        else if(n*m -wall <= T )
            printf("NO\n");
        else
        {
            visted[startx][starty] = 1;
            dfs(startx,starty,0);
            printf(flag? "YES\n" :"NO\n");
        }
    }
    return 0;
}
	posted on 2010-10-23 09:19 
付翔 阅读(287) 
评论(0)  编辑 收藏 引用  所属分类: 
ACM 数据结构