1. 程式人生 > >openjudge 2727:仙島求藥

openjudge 2727:仙島求藥

現在 pan blog 安全 node 大於 所在 陣列 using

2727:仙島求藥

總時間限制:
1000ms
內存限制:
65536kB
描述
少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由M×N個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現在李逍遙想盡快找到仙藥,顯然他應避開有怪物的方格,並經過最少的方格,而且那裏會有神秘人物等待著他。現在要求你來幫助他實現這個目標。
下圖 顯示了一個迷陣的樣例及李逍遙找到仙藥的路線.
技術分享
輸入
輸入有多組測試數據. 每組測試數據以兩個非零整數 M 和 N 開始,兩者均不大於20。M 表示迷陣行數, N 表示迷陣列數。接下來有 M 行, 每行包含N個字符,不同字符分別代表不同含義:
1) [email protected]
/* */:少年李逍遙所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙藥所在位置。
當在一行中讀入的是兩個零時,表示輸入結束。
輸出
對於每組測試數據,分別輸出一行,該行包含李逍遙找到仙藥需要穿過的最少的方格數目(計數包括初始位置的方塊)。如果他不可能找到仙藥, 則輸出 -1。
樣例輸入
8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
6 5
.*.#.
.#...
..##.
.....
.#...
....@
9 6
.#..#. 
.#.*.# 
.####. 
..#... 
..#... 
..#... 
..#... 
#.@.## 
.#..#. 
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:仙島求藥