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
样例输出
-
YES NO
提示
优先左走即:如果左边能走就向左走,如果不能走向前走,如果前不能走,向右走,如果右不能走向后走。
哈哈~先说说为什么看上这道题目了,因为我喜欢看吸血鬼日记,虽然越到后面批判的声音越多,但是还是希望看下去。另外爱上了初代。。哈哈。。所以看见了有关吸血鬼的题目果断想要做掉它~ ps:I love Damon and Klaus!!!
一看是看题目的时候果断的热情和自以为是让我赤裸裸的理解错了题目的意思,我以为只要能够找到最短的路径的情况下就一定可以找到最后的hunter,所以华丽丽的wa~
给出一组数据~~
5 5
. . . . .
.###.
.###.
.#X#.
T. . . .
这样的情况下就会一直向左走所以也就是找不到的~
另外,最后的方向也就是代码的精髓所在,表示我把每个方向的标记方向都列了出来,自认为很直观,还被嘲笑了。。。(渣渣的世界大神不懂)
但是还是勇敢的放出来~~
就是四个方向不同的左前右后~想当初理解这个都费了点劲。。。int flagN[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; int flagE[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; int flagS[4][2] = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}}; int flagW[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
讨论区的代码就用这个好好的理解精髓之后刷过去了~带上原博客的链接 http://blog.csdn.net/u014225783/article/details/40746279
#include<stdio.h> #include<string.h> int Dx,Dy,m,n; char a[101][101]; int dx[]={-1,0,1,0}; int dy[]={0,-1,0,1}; int key; int vis[101][101]; bool judge(int x,int y) { if(x<0||x>=n||y<0||y>=m||a[x][y]=='#') return false; return true; } void dfs(int DS,int x,int y) { if(key) return ; printf("%d %d %d\n",x,y,DS); for(int i=1;i>-3;i--) { int ds=(DS+i+8)%4; //改变顺序的精髓。。 printf("%d\n", ds); int xx=x+dx[ds]; int yy=y+dy[ds]; if(judge(xx,yy)) //判断该节点是否可以走,如果可以就向下,进行下一步递归,不可以就向下一个方向 { if(xx==Dx&&yy==Dy) { key=1; return ; } if(vis[xx][yy]==4) return ; vis[xx][yy]++; dfs(ds,xx,yy); return ; } } return ; } int main() { int sx,sy; while(scanf("%d %d",&n,&m)!=EOF) { for(int i=0; i<n; i++) { scanf("%s",a[i]); for(int j=0; j<m; j++) { if(a[i][j]=='T') sx=i,sy=j; else if(a[i][j]=='X') Dx=i,Dy=j; } } char sd[10]; scanf("%s",sd); int DS; if(sd[0]=='N') DS=0; else if(sd[0]=='W') DS=1; else if(sd[0]=='S') DS=2; else DS=3; key=0; memset(vis,0,sizeof(vis)); vis[sx][sy]=1; dfs(DS,sx,sy); if(key) puts("YES"); else puts("NO"); } }
-
输入包含多组测试数据,第一行输入 n , m ( 2 < n ,m <= 100) ,接下来n行每行m个字符,第 n + 2 行一个字符表示初始方向(E W S N)。