description
zyf對於自己人生的規劃是:健康and快樂。所以他沒有把全部的時間和精力投入到學習中,而是對跑步運動有著狂熱的愛好。經過他的努力,終於加入了運動隊,並且將在下個月代表學校參加省體育聯賽。他所參加的比賽叫做定向越野,是一種新興的運動專案,這項運動的規則(只取其中一種介紹。)是:給定運動員一張地圖(定向越野專用),地圖上有若干個點,並標有位置,包含起點△(以下用『s』表示)、終點◎(以下用『e』表示)、還有一些標有序號(1~n)的點。按照順序 s -> 1 -> 2 -> 3 -> …… -> n -> e 依次經過,最後計算時間。之前說到zyf是乙個追求完美的人,他想要知道某張地圖理論上完賽的最短時間,然後和自己的成績對比,只是他現在忙於訓練,沒時間去計算,你能幫助他,算出這個時間嗎?
地圖及其移動時間的計算:
『0』代表平地,移動到平地上需要1個單位的時間;
『#』代表草地,移動到草地上需要2個單位的時間;
『t』代表圍牆,移動到圍牆上(含在圍牆上移動),需要4個單位的時間;
『x』代表禁區,不可到達。
0 0 # 0 # 0 0
0 0 # # # # #
0 0 # 0 0 t t
0 0 # x x 0 #
0 0 0 x x 0 #
0 0 0 # # 0 #
0 0 # # # # 0
0 # # t t t #
# 0 # # 0 0 #
input
輸入資料的第一行有乙個整數t,表示有t組測試資料。
隨後是各組測試資料,每組資料保證有解,每組測試資料以「*」結束。
每組資料有一行,是兩個整數n,m。(1 <= n <= 15,1 <= m <=15)代表地圖的行數和列數。
接下來有n行m列的字元,代表地圖。
之後有若干行資料,表示點(兩個或兩個以上的點,最多不超過10個點)。
每行資料為 c,x,y。代表點c的位置在x行y列。
output
輸出乙個整數,表示完賽理論上的最短時間。
每組測試資料輸出一行。
sample input
29 700#0#00
00#####
00#00tt
00#xx0#
000xx0#
000##0#
00####0
0##ttt#
#0##00#
s 1 1
e 9 7
1 4 6
2 2 7
*3 3
0#0#x#
0#0e 1 1
s 3 3
*
sample output
356
思路:典型的bfs問題,但是遇到不同障礙物所需要用到的時間是不一致的,因此我們要讓當前花費最小的先出,用到優先佇列,用普通佇列的話求出來的不一定是最小時間。
#include #include using namespace std;
int n, m;
int mp[20][20];
int x[15], y[15];
int dx = ;
int dy = ;
struct node
friend bool operator < (const node &a, const node &b)
};int dis(int sx, int sy, int ex, int ed) ;
priority_queueq;
q.push(node(sx, sy, 0));
vis[sx][sy] = true;
while(!q.empty()) }}
return 0;
}void init()
}int route()
x[++cnt] = ex, y[cnt] = ey;
return cnt;
}int main(void)
cout << ans << endl;
}return 0;
}
優先佇列 BFS
hdu 5433 xiao ming climbing 這題就是優先佇列 bfs 但是一直wa 原因是在搜尋時標記的位置有問題。以前都沒有出現過這種情況 另外就是雖然找過這點的座標 先前到過這個點 但是鬥志值可能不一樣 題目中要求只要不為0就可以,也就是說到這個點的體力消耗可能會不一樣,要取最小的那...
BFS 優先佇列
湘潭大學2018 小明來到乙個由n x m個格仔組成的迷宮,有些格仔是陷阱,用 表示,小明進入陷阱就會死亡,表示沒有陷阱。小明所在的位置用 s 表示,目的地用 t 表示。小明只能向上下左右相鄰的格仔移動,每移動一次花費1秒。有q個單向傳送陣,每個傳送陣各有乙個入口和乙個出口,入口和出口都在迷宮的格仔...
BFS 記錄路徑 bfs 優先順序佇列
bfs 記錄路徑 原題鏈結 找到最短路徑,然後輸出,由於地圖上有怪物,我們還要額外記錄停留的時間。本題需要用到優先順序佇列,唔,大概意思就是對佇列進行排序,我們需要挑選最小的來計算,確保是最短路徑 關於優先順序佇列可以看這個 優先順序佇列 我在網上找到的我感覺講的很詳細的部落格。include in...