Salvation
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身。 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
样例输出
-
YES NO
-
这是个技巧题!
-
一定要自己多琢磨一下方向问题!
-
可以把任意方向作为标记为0(我把S作为0的方向),其他方向分别标记为1,2,3;(这个需要自己琢磨)!!!
-
(自己看了一下午我,哎!)!
-
还有mov数组的赋值也和你定的0方向有关!
-
我的标记 (s的前边)S 0; mov数组: 1,0 (s的前边) 方向和标记一致!
-
(s的左边)E 1; 0,1 (s的。。)
-
(s的右边)N 2; -1,0 (。。)
-
(s的后边)W 3; 0,-1 (。。)
-
由于四个方向原因,要在不同的方向行走:visit数组要标记4遍才算标记过!
-
好吧!就这样!
-
、代码:
-
#include<stdio.h> #include<string.h> #define N 110 int mov[4][2]={1,0,0,1,-1,0,0,-1}; int visit[N][N]; int n,m,bgx,bgy,endx,endy,mark; char map[N][N]; int judge(int x,int y) { return x>=0&&x<n&&y>=0&&y<m&&map[x][y]!='#'&&visit[x][y]<4; } void dfs(int DR,int x,int y) { if(mark) return; for(int i=1;i>-3;i--) { int dr=(DR+i+8)%4;//主要的功能的实现!自己先试试,把方向做定! int tx=x+mov[dr][0]; int ty=y+mov[dr][1]; if(judge(tx,ty)) { if(tx==endx&&ty==endy) mark=1; visit[tx][ty]++; dfs(dr,tx,ty); return ;//这里的理解,。。。,不加就wa了!暂时不太理解 } } return ; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int i,j; for(i=0;i<n;i++) { getchar(); for(j=0;j<m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='T') { bgx=i; bgy=j; } if(map[i][j]=='X') { endx=i; endy=j; } } } getchar(); char s; int DR; scanf("%c",&s); switch (s)//判断初始方向 { case 'S': DR=0;break; case 'E': DR=1;break; case 'N': DR=2;break; case 'W': DR=3;break; } memset(visit,0,sizeof(visit)); mark=0; dfs(DR,bgx,bgy); if(mark) printf("YES\n"); else printf("NO\n"); } return 0; }
-
-
-
-
输入包含多组测试数据,第一行输入 n , m ( 2 < n ,m <= 100) ,接下来n行每行m个字符,第 n + 2 行一个字符表示初始方向(E W S N)。