EOJ 1224 簡單迷宮問題

2022-05-26 03:36:11 字數 1635 閱讀 2294

單點時限: 2.0 sec

記憶體限制: 256 mb

一天,sunny 不小心進入了乙個迷宮,不僅很難尋找出路,而且有的地方還有怪物,但是 sunny 有足夠的能力殺死怪物,但是需要一定的時間,但是 sunny 想早一點走出迷宮,所以請你幫助他計算出最少的時間走出迷宮,輸出這個最少時間。

我們規定每走一格需要時間單位 1, 殺死怪物也需要時間 1, 如果不能走到出口,則輸出impossible. 每次走只能是上下左右 4 個方向。

每次首先 2

個數 n,m

(0,代表迷宮的高和寬,然後 n

行,每行 m

個字元。

處理到檔案結束。

輸出最少的時間走出迷宮。不能走出輸出impossible

input

4 4

s.x.

#..#

..#.

x..t

4 4s.x.

#..#

..#.

x.#t

output

6

impossible

題意:走迷宮,求最短路徑,上下左右走一格花費1,走到有怪的格仔花費2.

思路:

將每一點的座標和由起點到該點的距離存入結構體,由起點開始,將該點存入優先佇列,以到起點的距離dis為優先順序,每次取出dis最小的,向外擴散。

相當於第一輪得出所有到起點距離為1的點,第二輪得出所有到起點距離為2的點。

注意:對普通的最短路問題,由於每個各自的花費相同,因此每次存入的點優先順序都相同,故不需要使用優先佇列,但本題存在有無怪物的區別,每次存入的格仔的優先順序可能不同,故使用優先佇列。

1 #include2 #include3 #include4

using

namespace

std;

5char maze[201][201];6

intsx, sy, tx, ty;7//

左右上下4個方向

8int dx[4] = ;

9int dy[4] = ;

10int

m, n;

11struct

node ;

14bool

operator

< (const node& a, const node&b)

1518

void

bfs() ;

21 maze[sx][sy] = '#'

;22que.push(st);

23while (!que.empty())

31for (int i = 0; i < 4; ++i) ;

35if (nx >= 0 && nx < n&&ny >= 0 && ny < m&&maze[nx][ny] != '#'

) 43}44

}45 printf("

impossible\n");

46}47int

main()

59bfs();60}

61return0;

62 }

簡單迷宮問題

首先是深搜 又叫回溯法。include int n,m,p,q,min 999999 p,q為 終點座標,m,n為迷宮行數和列數 int a 51 51 book 51 51 void dfs int x,int y,int step return 返回上一步 int i,tx,ty,next 4 ...

迷宮問題求解(1) 簡單迷宮

標頭檔案 include include include include include maze.h define max 100 typedef struct position datatype typedef struct stack stack void stackinit stack s ...

簡單的迷宮問題

給你乙個n m的迷宮,這個迷宮中有以下幾個標識 s代表起點 t代表終點 x代表障礙物 代表空地 現在你們涵哥想知道能不能從起點走到終點不碰到障礙物 只能上下左右進行移動,並且不能移動到已經移動過的點 輸入第一行乙個整數t 1 t 10 接下來有t組測試資料,對於每一組測試資料,第一行輸入2個數n和m...