NYOJ 1129 Salvation(dfs+方向調整テクニック)

2394 ワード

説明
    
神秘的な滝町は神秘的な場所で、そこには吸血鬼、狼人、巫女、二重体があります.Klaus(吸血鬼の祖先)はElenaの血液を利用して彼の混血の大軍(吸血鬼&狼人)を発展させるために、神秘的な滝町にも来た.スティーブンはエレナを愛していたので、スティーブンは吸血鬼ハンターを呼び覚まし、エレナを救うことにした.
吸血鬼ハンターは迷路に閉じ込められていて、この迷路には方向感覚を失う特性があります.そこでStefanは、左を基準に(つまり左を優先)、次に前を向いて、右を向いて、どちらも歩けないなら後ろを向いている(つまり右を2回回す)方法を思いついた.彼は上下左右4方向のスペースに1つのグリッドを移動することができ、毎回1分かかります.Stefanはあなたが天賦のプログラマーであることを知った後、彼が吸血鬼ハンターを見つけることができるかどうかを判断することにした.
入力
複数組のテストデータを入力し、1行目はn,m(2“.”スペースを表し、「#」は壁を表し、「T」は初期位置を表し、「X」は吸血鬼ハンターの位置を表す.
しゅつりょく
1行出力し、出力「YES」が見つかれば「NO」を出力します.
サンプル入力
4 4
....
.##.
.##.
TX..
N
4 4
....
.##.
.###
T#.X
N

サンプル出力
YES
NO

acコード:
#include<stdio.h>
#include<string.h>
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
int v[105][105];
char map[105][105];
int bz,n,m,bs;
int fun(char c)//      
{
    if(c=='N')return 0;
    if(c=='W')return 1;
    if(c=='E')return 2;
    if(c=='S')return 3;
}
int check(int x,int y)//  
{
    if(x<0||x>=n||y<0||y>=m||map[x][y]=='#')
    return 0;
    return 1;
}
void dfs(int x,int y,int bs)
{
    if(bz==1)
    {
        return;
    }
    for(int i=1;i>-3;i--)
    {
        int ds=(bs+i+8)%4;//       
        int nx=x+dx[ds];
        int ny=y+dy[ds];
        if(check(nx,ny))
        {
            if(map[nx][ny]=='X')
            {
                bz=1;
                return;
            }
            if(v[nx][ny]==4)//      ,     4       
            return;
            v[nx][ny]++;
            dfs(nx,ny,ds);
            return;//   
        }
    }
}
int main()
{
    char str;
    int bx,by;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%s",map[i]);
            for(int j=0;j<m;j++)
             {
                 if(map[i][j]=='T')
                 {
                     bx=i;by=j;
                 }
             }
        }
        getchar();
        scanf("%c",&str);
        bz=0;
        memset(v,0,sizeof(v));
        v[bx][by]=1;
        dfs(bx,by,fun(str));
        if(bz)
        printf("YES
"); else printf("NO
"); } return 0; }