1. 程式人生 > 其它 >仙島求藥(藍橋杯寒假訓練題)

仙島求藥(藍橋杯寒假訓練題)

藍橋杯寒假訓練題

題目描述:

少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由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 
<cstdio> #include <algorithm> #include <cstring> #include <queue> #define M 21 using namespace std; int m, n, sx, sy, ex, ey; int jz[M][M]; bool v[M][M]; int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0}; //幾個方向 struct a { int x, y, step; } nex, noww; queue<a> q;
void bfs() { if (sx == ex && sy == ey) //防止出現起點等於終點的情況 { printf("0\n"); return; } while (!q.empty()) q.pop(); //因為有多組資料需要進行清空 noww.x = sx; noww.y = sy; noww.step = 0; //初始化 v[sx][sy] = 1; //進行標記已經被訪問 q.push(noww); while (!q.empty()) { noww = q.front(); //取出隊頭元素 q.pop(); for (int i = 0; i < 4; i++) { int xx = noww.x + dx[i], yy = noww.y + dy[i]; if (xx > 0 && xx <= m && yy > 0 && yy <= n && !v[xx][yy] && jz[xx][yy]) { if (xx == ex && yy == ey) //如果到達終點 { printf("%d\n", noww.step + 1); //輸出答案 return; //不能夠寫break!因為break只能夠跳出for迴圈 } nex.x = xx; nex.y = yy; nex.step = noww.step + 1; v[xx][yy] = 1; //標記 q.push(nex); //進隊 } } } cout << "-1" << endl; //沒有找到輸出-1 } int main() { char ch; while (scanf("%d%d", &m, &n) != EOF) //在不清楚擁有幾組資料的情況下 { if (m != 0 && n != 0) { memset(jz, 0, sizeof(jz)); memset(v, 0, sizeof(v)); for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) { cin >> ch; if (ch == '@') //李(起)逍(點)遙 { sx = i; sy = j; } if (ch == '*') //仙(終)藥(點) { ex = i; ey = j; } if (ch == '#') //怪(障)物(礙) { continue; } jz[i][j] = 1; } bfs(); } else break; } return 0; }

本文來自部落格園,作者:Sian543,轉載請註明原文連結:https://www.cnblogs.com/Sian543/p/15815694.html