一本通題解 1251 仙島求藥

2021-10-03 12:01:57 字數 2759 閱讀 6236

一本通 oj,

計蒜客 oj,

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

輸入有多組測試資料. 每組測試資料以兩個非零整數 m 和 n 開始,兩者均不大於20。m 表示迷陣行數, n 表示迷陣列數。接下來有 m 行, 每行包含n個字元,不同字元分別代表不同含義:

1)『@』:少年李逍遙所在的位置;

2)『.』:可以安全通行的方格;

3)『#』:有怪物的方格;

4)『*』:仙藥所在位置。

當在一行中讀入的是兩個零時,表示輸入結束。

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

8 8

.@##...#

#....#.#

#.#.##..

..#.###.

#.#...#.

..###.#.

...#.*..

.#...###

10
走迷宮問題,自然是典型的 bfs 模板題。

乙個 m*n 大小的迷宮,我們從 @ 位置出發(也就是起點),字元 . 表示可以安全通行的方格,字元 # 表示有怪物(也就是不能走),字元 * 表示仙藥(也就是終點)。要求輸出從 @ 到 * 的最短路徑。那麼迷宮問題的基本要素全齊了,所以本題就是一道 bfs 模板題。

w = 8,h=8。

如下圖所示,我們這樣建立座標系。

從上圖座標系中,我們可以知道,起點 @ 的座標為 (1, 0)。

從上圖座標系中,我們可以知道,終點 * 的座標為 (5, 6)。

一般走迷宮問題,預設的移動方向就是四個,即上下左右。根據上面的座標系,我們可以定義出如下的移動增量:

const pos move = , , , };
從哪個方向開始,如何擺放位置,是不會影響最終的結果。

如下圖綠色所示,最終最短的路徑是 10 步。

1、讀入資料,並寫入到合適的資料結構中。

2、找到起點位置,將起點加入到佇列 q 中。

3、記錄終點位置資訊。

4、開始 bfs 遍歷。直到找到終點或者遍歷所有節點而無法到達終點。

#include #include struct pos ;

const int maxn = 200;

struct maze ;

int bfs(maze &maze);

int main() ;

scanf("%d %d", &maze.m, &maze.n);

//讀入迷宮

int i, j;

for (i=0; iq;

const pos move = , , , };//定義移動方法

pos cur, next;

//加入起點,從起點位置開始遍歷

cur.x = maze.x1;

cur.y = maze.y1;

cur.cost = 0;

maze.visit[cur.x][cur.y] = true;

q.push(cur);

//開始遍歷

while (!q.empty())

//判斷通過性

if (next.x>=0&&next.x=0&&next.y1、如何表示乙個節點的座標,以及該節點到起點的距離。這裡我用乙個自定義的結構體來表示。如下所示:

struct pos ;

2、如何表示乙個迷宮。這裡我將所有迷宮資訊全部放在乙個自定義結構體中,增強了**可讀性。如下所示:

const int maxn = 200;

struct maze ;

3、如何表示所有移動可能性。如下所示:

const pos move = , , , };//定義移動方法
4、新節點通過性判斷問題。根據題目進行判斷,基本包括以下幾個方面:

(1)這個位置可以走,如本題中用字元 . 表示。如下所示:

maze.data[next.x][next.y]!='#'
(2)這個位置沒有訪問過。如下所示:

maze.visit[next.x][next.y]==false
(3)這個位置處於迷宮內。這個判斷和您程式對迷宮定義有關。如下所示:

next.x>=0&&next.x=0&&next.yp.s.

本題解不能完全適用於一本通的題目,因為一本通的輸入裡有多個迷宮。只需要將**簡單改動即可。

1251 仙島求藥

1251 仙島求藥 時間限制 1000 ms 記憶體限制 65536 kb 提交數 6817 通過數 2910 題目描述 少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由m n個方格組...

資訊學奧賽一本通 1251 仙島求藥(evd)

題目描述 少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由m n個方格組成,有的方格內有可以瞬秒李逍遙的怪物,而有的方格內則是安全。現在李逍遙想盡快找到仙藥,顯然他應避開有怪物的方格,...

仙島求藥(一)

仙島求藥 一 難度級別 b 執行時間限制 1000ms 執行空間限制 256000kb 長度限制 2000000b 試題描述 少年李逍遙的嬸嬸病了,王小虎介紹他去一趟仙靈島,向仙女姐姐要仙丹救嬸嬸。叛逆但孝順的李逍遙闖進了仙靈島,克服了千險萬難來到島的中心,發現仙藥擺在了迷陣的深處。迷陣由m n個方...