神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身。 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");
}
}