3012 - 小俞同学的危机
时间限制 : 1 秒
内存限制 : 128 MB
最近小俞同学学习真是太累了,不知不觉就趴在桌子上睡着了。她进入了一个奇怪的梦境,梦到进入了一个迷宫里,这下可愁坏了小俞,最近没吃饱,走也走不动了,只能困在迷宫里面动不了。幸运的是她在梦里梦见了你也在迷宫里,你手里还有一些好吃的,把这些好吃的给她,她就能和你一起跑出去啦。不过迷宫里面有一些大恶魔在,还好你有足够的力量消灭它,但是消灭它也需要一些时间的。好吧,地图给你了,现在快去营救机房女神吧!!
地图是一个四方的地图,你只能从一个格子从上、下、左、右、四个方向走到另一个临近的格子里面,并且花费1个时间单位,消灭恶魔也需要一个单位,有恶魔在的格子,只有消灭了恶魔,才能通行。
题目输入
第一行N和M代表N行M列(1<=N<=200, 1<=M<=200)
接下来N行,没行M个字符,每个字符之间没有空格,整个输入保证没有多余不可见字符。
‘a’代表小俞同学的所在地,‘r'代表你的起始位置,’x'代表恶魔,’#'是墙,'.'代表道路。
题目输出
每组测试样例,输出一个整数,表示从出发到接到小俞同学的步数。由于小俞同学非常的害怕和饿(主要是饿),你要不是用最少的步数到达她身边的话,她就会不高兴,而且最重要的是她不跟你走!!!这样她就永远的困在梦境里面了。。。。。(你的任务也失败了)好惨
不过如果你根本到达不了她身边的话,就输出“I'm so sorry, but I can fly! bye~”(输出不带引号)。
输入/输出样例
输入格式
7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........
输出格式
13
C语言解答
#include<stdio.h> #include<string.h> char a[202][202]; int b[202][202]; int n,m,sum; void dfs(int x,int y,int t) { if(a[x][y]=='a'&&t<sum) sum=t; if(!b[x][y]&&a[x][y]!='#'&&x-1>=0) { b[x][y]=1; if(a[x][y]=='x') dfs(x-1,y,t+2); else dfs(x-1,y,t+1); b[x][y]=0; } if(!b[x][y]&&a[x][y]!='#'&&x+1<n) { b[x][y]=1; if(a[x][y]=='x') dfs(x+1,y,t+2); else dfs(x+1,y,t+1); b[x][y]=0; } if(!b[x][y]&&a[x][y]!='#'&&y-1>=0) { b[x][y]=1; if(a[x][y]=='x') dfs(x,y-1,t+2); else dfs(x,y-1,t+1); b[x][y]=0; } if(!b[x][y]&&a[x][y]!='#'&&y+1<m) { b[x][y]=1; if(a[x][y]=='x') dfs(x,y+1,t+2); else dfs(x,y+1,t+1); b[x][y]=0; } } int main() { int i,j,x1,x2,y1,y2; while(scanf("%d%d",&n,&m)!=EOF) { getchar(); for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='r') x1=i,y1=j; if(a[i][j]=='a') x2=i,y2=j; } getchar(); } memset(b,0,sizeof(b)); sum=999999; dfs(x1,y1,0); if(sum==999999) printf("I'm so sorry, but I can fly! bye~\n"); else printf("%d\n",sum); } return 0; }
C++解答
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; int n, m; char mp[205][205]; bool v[205][205]; int mv[4][2] = { 1, 0, 0, 1, 0, -1, -1, 0 }; struct Node { int x; int y; int tep; Node(int tx, int ty, int tep) { x = tx; y = ty; this -> tep = tep; } Node(){} }; int bfs(int sx, int sy) { queue<Node> Q; Node node(sx, sy, 0); Node temp; Q.push(node); int x, y, tep; while(!Q.empty()) { temp = Q.front(); Q.pop(); x = temp.x; y = temp.y; tep = temp.tep; // printf("x = %d y = %d tep = %d\n", x, y, tep); if(mp[x][y] == 'a') { return tep; } if(mp[x][y] == 'x') { mp[x][y] = '.'; Node p(x, y, tep + 1); Q.push(p); continue; } for(int i = 0; i < 4; i++) { int tx = x + mv[i][0]; int ty = y + mv[i][1]; if(tx <0 || ty < 0 || tx >= n || ty >= m) { continue; } if(!v[tx][ty] && mp[tx][ty] != '#') { v[tx][ty] = true; Node p(tx, ty, tep + 1); Q.push(p); } } } return 0; } int main() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(cin >> n >> m) { int sx, sy; memset(v, false, sizeof(v)); for(int i = 0; i < n; i++) { for(int k = 0; k < m; k++) { cin >> mp[i][k]; if(mp[i][k] == 'r') { sx= i; sy = k; } } } int t = bfs(sx, sy); if(t) { printf("%d\n", t); } else { printf("I'm so sorry, but I can fly! bye~\n"); } } return 0; }