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

2727:仙島求藥-Openjudge

2727:仙島求藥

2727:仙島求藥

描述

  少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由M×N個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現在李逍遙想盡快找到仙藥,顯然他應避開有怪物的方格,並經過最少的方格,而且那裡會有神祕人物等待著他。現在要求你來幫助他實現這個目標。
  下圖 顯示了一個迷陣的樣例及李逍遙找到仙藥的路線.
在這裡插入圖片描述

輸入

  輸入有多組測試資料. 每組測試資料以兩個非零整數 M 和 N 開始,兩者均不大於20。M 表示迷陣行數, N 表示迷陣列數。接下來有 M 行, 每行包含N個字元,不同字元分別代表不同含義:
  1) ‘@’:少年李逍遙所在的位置;
  2) ‘.’:可以安全通行的方格;
  3) ‘#’:有怪物的方格;
  4) ‘*’:仙藥所在位置。
  當在一行中讀入的是兩個零時,表示輸入結束。

輸出

  對於每組測試資料,分別輸出一行,該行包含李逍遙找到仙藥需要穿過的最少的方格數目(計數包括初始位置的方塊)。如果他不可能找到仙藥, 則輸出 -1。
樣例輸入
8 8
[email protected]

##…#
#…#.#
#.#.##…
…#.###.
#.#…#.
…###.#.
…#.
.#…###
6 5
.
.#.
.#…
…##.

.#…
…@
9 6
.#…#.
.#.*.#
.####.
…#…
…#…
…#…
…#…
#[email protected]##
.#…#.
0 0
樣例輸出
10
8
-1

解析

BFS典型入門題目,記錄一下步數,到達地點立刻結束,在多組輸入的情況下這是dfs無法做到的.

#include <cmath>
#include <ctime>
#include <queue>
#include <cstdio>
#include <string> #include <cstring> #include <iostream> #include <algorithm>//標頭檔案準備 using namespace std; char a[21][21]; int n, m, dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 }; struct vec { int x, y, step; }s,e,p; int main() { while (cin >> n >> m&&n!=0&&m!=0) { memset(a, 0, sizeof(a)); for(int i=0;i<n;i++) for (int j = 0; j < m; j++) { cin >> a[i][j]; if (a[i][j] == '@') s.x = i, s.y = j, s.step = 0; else if (a[i][j] == '*') e.x = i, e.y = j, e.step = -1; } queue<vec >q; q.push(s); while (q.size() != 0) { p = q.front(), q.pop(); if (p.x == e.x&&p.y == e.y) { e.step = p.step; break; } for (int i = 0; i < 4; i++) { vec r = p; r.x+= dx[i], r.y+= dy[i],r.step++; if (r.x >= 0 && r.x < n&&r.y >= 0 && r.y < m&&a[r.x][r.y] != '#') { q.push(r); a[r.x][r.y] = '#'; } } } cout << e.step << endl; } return 0; }