一本通 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 遍歷。直到找到終點或者遍歷所有節點而無法到達終點。
2、如何表示乙個迷宮。這裡我將所有迷宮資訊全部放在乙個自定義結構體中,增強了**可讀性。如下所示:#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 ;
3、如何表示所有移動可能性。如下所示:const int maxn = 200;
struct maze ;
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個方...