信息学奥赛一本通(1251:仙岛求药)
1251:仙島求藥
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 11479 ??? 通過數: 4968
【題目描述】
少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由M×N個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現在李逍遙想盡快找到仙藥,顯然他應避開有怪物的方格,并經過最少的方格,而且那里會有神秘人物等待著他。現在要求你來幫助他實現這個目標。
下圖 顯示了一個迷陣的樣例及李逍遙找到仙藥的路線。
【輸入】
輸入有多組測試數據. 每組測試數據以兩個非零整數 M 和 N 開始,兩者均不大于20。M 表示迷陣行數, N 表示迷陣列數。接下來有 M 行, 每行包含N個字符,不同字符分別代表不同含義:
1)‘@’:少年李逍遙所在的位置;
2)‘.’:可以安全通行的方格;
3)‘#’:有怪物的方格;
4)‘*’:仙藥所在位置。
當在一行中讀入的是兩個零時,表示輸入結束。
【輸出】
對于每組測試數據,分別輸出一行,該行包含李逍遙找到仙藥需要穿過的最少的方格數目(計數包括初始位置的方塊)。如果他不可能找到仙藥, 則輸出 -1。
【輸入樣例】
8 8 .@##...# #....#.# #.#.##.. ..#.###. #.#...#. ..###.#. ...#.*.. .#...### 6 5 .*.#. .#... ..##. ..... .#... ....@ 9 6.#..#. .#.*.# .####. ..#... ..#... ..#... ..#... #.@.## .#..#. 0 0【輸出樣例】
10 8 -1?【分析】
? ? ? ? 這是一個走迷宮的經典題目,做法和圖連通性一樣。
【參考代碼】
#include<iostream> #include<queue> using namespace std;const int N=25;struct point {int x,y; //坐標 int step; //從出發點到達(i,j)需要的步數 }Start,End;int m,n; //迷陣地圖尺寸,m行數, n列數 char map[N][N]; //迷陣地圖數組 int dx[4]={-1,0,1,0}; //上右下左 int dy[4]={0,1,0,-1};void bfs() {queue <point> q;if(Start.x==End.x && Start.y==End.y){End.step=1;return;}q.push(Start);while(!q.empty()){point t,temp;t=q.front();for(int i=0;i<4;i++) //四個方向探索 {int nx=t.x+dx[i];int ny=t.y+dy[i];if(nx>=0 && nx<m && ny>=0 && ny<n && map[nx][ny]=='.'){temp.x=nx;temp.y=ny;temp.step=t.step+1;q.push(temp);map[nx][ny]='#';if(nx==End.x && ny==End.y){End.step=temp.step;return ;}}}q.pop();} }int main() {int i,j;while(cin >> m >> n && m||n){for(i=0;i<m;i++)cin >> map[i];for(i=0;i<m;i++){for(j=0;j<n;j++){if(map[i][j]=='@'){Start.x=i;Start.y=j;Start.step=0; //起點步數是0}else if(map[i][j]=='*'){End.x=i;End.y=j;End.step=-1; //找不到時,輸出-1。所以默認是-1map[i][j]='.';}}}bfs();cout << End.step << endl;}return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1251
總結
以上是生活随笔為你收集整理的信息学奥赛一本通(1251:仙岛求药)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 1105:数组逆序重存
- 下一篇: 信息学奥赛一本通(1109:开关灯)