openjudge 2727:仙岛求药
Posted ioioioioioio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openjudge 2727:仙岛求药相关的知识,希望对你有一定的参考价值。
2727:仙岛求药
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
下图 显示了一个迷阵的样例及李逍遥找到仙药的路线. - 输入
- 输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:
1) ‘@’:少年李逍遥所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙药所在位置。
当在一行中读入的是两个零时,表示输入结束。 - 输出
- 对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。
- 样例输入
-
8 8 [email protected]##...# #....#.# #.#.##.. ..#.###. #.#...#. ..###.#. ...#.*.. .#...### 6 5 .*.#. .#... ..##. ..... .#... [email protected] 9 6 .#..#. .#.*.# .####. ..#... ..#... ..#... ..#... #[email protected]## .#..#. 0 0
- 样例输出
-
10 8 -1
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 const int N=21; 7 struct node{ 8 int x,y,step; 9 }now,nxt; 10 queue<node>q; 11 int n,m; 12 int a[N][N]; 13 int xd[4]={-1,0,1,0}; 14 int yd[4]={0,1,0,-1}; 15 bool vis[N][N]; 16 int sx,sy,ex,ey; 17 void bfs() 18 { 19 if(sx==ex&&sy==ey) 20 { 21 cout<<"0"<<endl; 22 return ; 23 } 24 while(!q.empty())q.pop(); 25 now.x=sx;now.y=sy;now.step=0; 26 vis[sx][sy]=true; 27 q.push(now); 28 while(!q.empty()) 29 { 30 now=q.front();q.pop(); 31 for(int i=0;i<4;i++) 32 { 33 int xx=now.x+xd[i]; 34 int yy=now.y+yd[i]; 35 if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]&&a[xx][yy]) 36 { 37 if(xx==ex&&yy==ey) 38 { 39 cout<<now.step+1<<endl; 40 return ; 41 } 42 nxt.x=xx; 43 nxt.y=yy; 44 nxt.step=now.step+1; 45 vis[nxt.x][nxt.y]=true; 46 q.push(nxt); 47 } 48 } 49 } 50 printf("-1\n"); 51 } 52 int main() 53 { 54 while(scanf("%d%d",&n,&m)!=EOF) 55 { 56 if(!n) return 0; 57 memset(vis,0,sizeof(vis)); 58 memset(a,0,sizeof(a)); 59 for(int i=1;i<=n;i++) 60 for(int j=1;j<=m;j++) 61 { 62 char ch; 63 cin>>ch; 64 if(ch==‘#‘) continue; 65 a[i][j]=1; 66 if(ch==‘@‘) { ex=i; ey=j;} 67 else if(ch==‘*‘) { sx=i; sy=j;} 68 } 69 bfs(); 70 } 71 }
以上是关于openjudge 2727:仙岛求药的主要内容,如果未能解决你的问题,请参考以下文章