/*这个题是个好题啊。。DFS。。加奇偶剪枝。。
DFS就不说了。。说一下奇偶剪枝,,
可以把map看成这样:
        0 1 0 1 0 1
        1 0 1 0 1 0
        0 1 0 1 0 1
        1 0 1 0 1 0
        0 1 0 1 0 1
        从为 0 的格子走一步,必然走向为 1 的格子
        从为 1 的格子走一步,必然走向为 0 的格子
        即:
        0 ->1或1->0 必然是奇数步
        0->0 走1->1 必然是偶数步
        所以当遇到从 0 走向 0 但是要求时间是奇数的,
        或者, 从 1 走向 0 但是要求时间是偶数的
        都可以直接判断不可达!
就是如果,走到某个格子的时候,判断这个格子到终点的步数和时间有没有同奇同偶,没有的话就不可能在要求的时间点到达终点。
。就可以直接剪掉、、
剪枝是一个很重要的思想。。很多的时候都要用到这个思想。。不然都会TLE。。*/

#include <stdio.h> 
#include <iostream>
#include <math.h>
#include<stdlib.h>//abs()有的时候要加这个头文件
using namespace std;
 
#define size 10 
bool status; 
int DogX,DogY,DoorX,DoorY; 
int M,N,T; 
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};  
char maze[size][size]; 
void DFS(int x,int y,int t) 

    int dx,dy; 
    int i; 
    if(t==T&&x==DoorX&&y==DoorY) 
        status=true; 
    if(status) 
        return ; 
    if((abs(DoorX-x)+abs(DoorY-y))%2!=(T-t)%2) //奇偶剪枝。。现在的步数要跟给定的时间同奇同偶;
        return ; 
    for(i=0;i<4;i++) 
    { 
        dx=x+dir[i][0]; 
        dy=y+dir[i][1]; 
        if(dx>=0&&dx<M&&dy>=0&&dy<N&&maze[dx][dy]!='X') 
        { 
            maze[dx][dy] = 'X'; 
            DFS(dx,dy,t+1); 
            maze[dx][dy] = '.';  //回溯
        } 
    } 

int main() 
{        
    int i,j; 
    int num;
    while(scanf("%d%d%d",&M,&N,&T)!=EOF) 
    { 
        if(M==0&&N==0&&T==0) 
            break; 
        num=0; 
        status=false; 
        for (i=0;i<M;i++) 
        { 
            for (j=0;j<N;j++) 
            { 
                cin>>maze[i][j]; 
                if (maze[i][j]=='S') 
                { 
                    DogX = i; 
                    DogY = j; 
                } 
                else if(maze[i][j]=='D') 
                { 
                    DoorX=i;DoorY=j; 
                    num++; 
                } 
                else 
                    num++; 
            } 
            getchar(); 
        } 
        maze[DogX][DogY]='X'; 
        if(num>=T) //可以走的地方如果比时间少的话那就一定不行了。
            DFS(DogX,DogY,0); 
        if(status) 
            printf("YES\n"); 
        else 
            printf("NO\n"); 
    } 
    return 0; 
}

 

posted on 2011-09-02 12:12  →木头←  阅读(196)  评论(0编辑  收藏  举报