湘潭大學2018
小明來到乙個由n x m個格仔組成的迷宮,有些格仔是陷阱,用』#『表示,小明進入陷阱就會死亡,』.'表示沒有陷阱。小明所在的位置用』s』表示,目的地用』t』表示。
小明只能向上下左右相鄰的格仔移動,每移動一次花費1秒。
有q個單向傳送陣,每個傳送陣各有乙個入口和乙個出口,入口和出口都在迷宮的格仔裡,當走到或被傳送到乙個有傳送陣入口的格仔時,小明可以選擇是否開啟傳送陣。如果開啟傳送陣,小明就會被傳送到出口對應的格仔裡,這個過程會花費3秒;如果不開啟傳送陣,將不會發生任何事情,小明可以繼續向上下左右四個方向移動。
乙個格仔可能既有多個入口,又有多個出口,小明可以選擇任意乙個入口開啟傳送陣。使用傳送陣是非常危險的,因為有的傳送陣的出口在陷阱裡,如果小明使用這樣的傳送陣,那他就會死亡。也有一些傳送陣的入口在陷阱裡,這樣的傳送陣是沒有用的,因為小明不能活著進入。請告訴小明活著到達目的地的最短時間。
輸入描述:
有多組資料。對於每組資料:
第一行有三個整數n,m,q(2≤ n,m≤300,0≤ q ≤ 1000)。
接下來是乙個n行m列的矩陣,表示迷宮。
最後q行,每行四個整數x1,y1,x2,y2(0≤ x1,x2< n,0≤ y1,y2< m),表示乙個傳送陣的入口在x1行y1列,出口在x2行y2列。
輸出描述:
如果小明能夠活著到達目的地,則輸出最短時間,否則輸出-1。
示例1輸入
5 5 1
…s……
.###.
……t…
1 2 3 3
5 5 1
…s……
.###.
……t…
3 3 1 2
5 5 1
s.#…
…#…###………t
0 1 0 2
4 4 2
s#.t
.#.#
.#.#
.#.#
0 0 0 3
2 0 2 2輸出6
8-13bfs簡單題
因花費秒數不全為1(即相當於點之間距離不全為1),所以要用優先佇列,盡可能讓秒數少的在佇列前面,這樣在前面的一旦到達終點所用時長必然是最短時長。
優先佇列的使用
struct node
}node;
把時長從小到大排隊,相當於多了乙個關鍵字,時長越小的越靠前。
此題需要注意傳送走到的點不能立馬標記,因為有可能傳過去花費時間比走過去花費時間長,所以所有的標記應該在上下左右四個方向走的時候標記而不是傳送後標記。
此題還可建圖最短路,維護邊權為1和3。後續補上此方法。
**如下
#include
#include
#include
#include
#include
using
namespace std;
int dir[4]
[2]=
,,,}
;int r,n,m;
int sx,sy,tx,ty;
int vis[
305]
[305];
char mp[
305]
[305];
struct node
}node;
priority_queue q;
node send[
305]
[305];
void
bfs()
q.pop();
//有傳送門
if(send[x]
[y].step==
1&& vis[send[x]
[y].x]
[send[x]
[y].y]!=1
)for
(int i=
0;i<
4;i++)}
printf
("-1\n");
}int
main()
}int x1,x2,y1,y2;
for(
int i=
0;i)bfs()
;}}
優先佇列 BFS
hdu 5433 xiao ming climbing 這題就是優先佇列 bfs 但是一直wa 原因是在搜尋時標記的位置有問題。以前都沒有出現過這種情況 另外就是雖然找過這點的座標 先前到過這個點 但是鬥志值可能不一樣 題目中要求只要不為0就可以,也就是說到這個點的體力消耗可能會不一樣,要取最小的那...
BFS 記錄路徑 bfs 優先順序佇列
bfs 記錄路徑 原題鏈結 找到最短路徑,然後輸出,由於地圖上有怪物,我們還要額外記錄停留的時間。本題需要用到優先順序佇列,唔,大概意思就是對佇列進行排序,我們需要挑選最小的來計算,確保是最短路徑 關於優先順序佇列可以看這個 優先順序佇列 我在網上找到的我感覺講的很詳細的部落格。include in...
HDU 2653 BFS 優先佇列
這題題意 告訴起點y的位置,然後告訴終點l的位置,然後輸入 n,m,t p,其中 n和m是代表行和列,而t 是時間,p代表能量,如果在t範圍內沒有找到l的話,就失敗了,如果在t範圍內找到了l,那麼求出最少步數,代表空地,可以走路過去,也可以飛過去,代表不能走路過去,也不能飛過去,而 代表的是可以飛過...