nyoj1129——Salvation (优先左,前,右,后走的搜索)

     

    神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身。 Klaus(吸血鬼祖先) 为了利用 Elena 的血液发展他的混血大军(吸血鬼&狼人),也来到了神秘瀑布镇。Stefan 因为深爱着 Elena ,于是 Stefan 决定去唤醒吸血鬼猎人,来解救 Elena 

     吸血鬼猎人被封锁在一个迷宫里,这个迷宫有一种特性,只要进入就会失去方向感。于是 Stefan 想到一种方法,以左为标准(即优先左走),其次向前,向右,如果都无法走就向后走(即向右转两次)。他可以向上下左右四个方向的空格移动一个格,每次耗费1分钟。Stefan 在得知你是一个有天赋的程序员后,决定让你判断他是否能找到吸血鬼猎人。


输入描述:

输入包含多组测试数据,第一行输入 n , m ( 2 < n ,m <= 100) ,接下来n行每行m个字符,第 n + 2 行一个字符表示初始方向(E W S N)。“.”代表空格 ,“#”代表墙 , “ T ”代表初始位置,“X”代表吸血鬼猎人的位置。

输出描述:

输出一行,如果能找到输出“YES”,否则输出“NO”。

样例输入:

复制
4 4
....
.##.
.##.
TX..
N
4 4
....
.##.
.###
T#.X
N

样例输出:

 
 

YESNO

前言:比赛的时候wa了好多发,后来发下m写成了n,内心绝望。

思路:带方向的搜索,定义二维数组的时候加个方向。

#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
int n,m,flag;
char a[110][110];
char b[110][110][4];
int pyx[200];
char z[5];
int v[4][2]= {-1,0,0,1,1,0,0,-1};
int pan(int x,int y,int f)
{
    for(int i=0; i<4;f++,i++)
    {
        int p=(f-1+4)%4;
        if(x+v[p][0]<0||x+v[p][0]>=n||y+v[p][1]<0||y+v[p][1]>=m)
            continue;
        if(a[x+v[p][0]][y+v[p][1]]=='.')
        {
            if(b[x+v[p][0]][y+v[p][1]][p])
                return 0;
            b[x+v[p][0]][y+v[p][1]][p]=1;
            pan(x+v[p][0],y+v[p][1],p);
            return 0;
        }
        else if(a[x+v[p][0]][y+v[p][1]]=='X')
        {
            flag=1;
            return 0;
        }
    }
}
int main()
{
    int x,y;
    pyx['N']=0,pyx['E']=1,pyx['S']=2,pyx['W']=3;
    while(~scanf("%d%d",&n,&m))
    {
        flag=0;
        for(int i=0; i<n; i++)
        {
            scanf("%s",a[i]);
            for(int j=0; j<m; j++)
            {
                if(a[i][j]=='T')
                {
                    x=i;
                    y=j;
                    a[x][y]='.';
                    break;
                }
            }
        }
        scanf("%s",z);
        memset(b,0,sizeof(b));
        pan(x,y,pyx[z[0]]);
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值