單點時限: 2.0 sec
記憶體限制: 256 mb
一天,sunny 不小心進入了乙個迷宮,不僅很難尋找出路,而且有的地方還有怪物,但是 sunny 有足夠的能力殺死怪物,但是需要一定的時間,但是 sunny 想早一點走出迷宮,所以請你幫助他計算出最少的時間走出迷宮,輸出這個最少時間。
我們規定每走一格需要時間單位 1, 殺死怪物也需要時間 1, 如果不能走到出口,則輸出impossible
. 每次走只能是上下左右 4 個方向。
每次首先 2
個數 n,m
(0,代表迷宮的高和寬,然後 n
行,每行 m
個字元。
處理到檔案結束。
輸出最少的時間走出迷宮。不能走出輸出impossible
。
input
4 4s.x.
#..#
..#.
x..t
4 4s.x.
#..#
..#.
x.#t
output
6impossible
題意:走迷宮,求最短路徑,上下左右走一格花費1,走到有怪的格仔花費2.
思路:
將每一點的座標和由起點到該點的距離存入結構體,由起點開始,將該點存入優先佇列,以到起點的距離dis為優先順序,每次取出dis最小的,向外擴散。
相當於第一輪得出所有到起點距離為1的點,第二輪得出所有到起點距離為2的點。
注意:對普通的最短路問題,由於每個各自的花費相同,因此每次存入的點優先順序都相同,故不需要使用優先佇列,但本題存在有無怪物的區別,每次存入的格仔的優先順序可能不同,故使用優先佇列。
1 #include2 #include3 #include4using
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...