~~手動分割~~
這是此題的標準解法。
先將給定的a個感染源入隊,並將其所在格的感染時間設為0。
//先將a個感染源所在的結點入隊
for(i=
0;i)
依次將佇列中的每個點作為父結點,嘗試將每個父結點的4個方向的子結點入隊。
for
(i=0
;i<
4;i++
)//嘗試將每個父結點的4個方向的子結點入隊
………………//此處為省略的**
}
在嘗試將結點入隊時,若該結點還未被訪問過,則將該結點標記為已訪問,再將它的感染時間賦為它的父結點的感染時間+1.
if
(!visit[x]
[y])
//若該格未被訪問過
若該結點已被訪問過,則檢查一下它的父結點的感染時間+1是否小於該結點之前記錄的最短感染時間。若小於,則進行替換。
else
//若該格已被訪問過
}
ac**
#include
#include
#include
int n,m,a,b;
//地圖有n行m列,有a個感染源,領主數量為b
int location[4]
[2]=
,,,}
;//4個方位
int infection_source[
100002][
2],lord[
100002][
2];//陣列infection_source儲存感染源的座標,lord儲存領主的座標
int infection_time[
502]
[502
],visit[
502]
[502];
//陣列visit標記每一格是否被訪問過,陣列infection_time用於標記地圖每一格的最短感染時間
struct node
queue[
1000000];
intboundary_detection
(int x,
int y)
//座標的邊界判定
return1;
//返回真值
}int
bfs()if
(!visit[x]
[y])
//若該格未被訪問過
else
//若該格已被訪問過}}
head++;}
return0;
}int
main()
for(i=
1;i<=b;i++
)//先將a個感染源所在的結點入隊
for(i=
0;ibfs();
//輸出結果
此題資料較弱,可以使用暴力解法。
每個領主結點的最短感染時間就是該領主與所有感染源的曼哈頓距離中最短的那個距離。
直接列舉出每個領主與所有感染源的曼哈頓距離,通過比較就可得到最短的曼哈頓距離。
#include
#include
#include
int n,m,a,b;
//地圖有n行m列,有a個感染源,領主數量為b
int manhattan_distance;
//manhattan_distance儲存領主到所有感染源的最短曼哈頓距離
int infection_source[
100002][
2],lord[
100002][
2];//陣列infection_source儲存感染源的座標,lord儲存領主的座標
intmain()
for(i=
1;i<=b;i++
)//尋找最短曼哈頓距離
血色先鋒隊 BFS
給出 k k 個起始點和 t role presentation t t個結束點,求每個結束點距離任意乙個起始點的最短馬哈頓距離。in put inp ut 5 4 2 3 1 15 4 3 35 3 2 4ou tput o ut pu t3 13裸的bf s bfs 讀入每個起始點的位置後就可以...
血色先鋒隊 BFS
給出 k role presentation k k個起始點和 t role presentation t t個結束點,求每個結束點距離任意乙個起始點的最短馬哈頓距離。in put role presentation inp utin put5 4 2 3 1 15 4 3 35 3 2 4ou t...
題解 P1332 血色先鋒隊
中心思想是進行乙個貪心 輸入乙個領主的位置,求出與所有感染源的曼哈頓距離,再取最小值,找到最近的乙個感染源,輸出感染源與這個領主的曼哈頓距離。ps 曼哈頓距離 在平面上,座標 x1,y1 的i點與座標 x2,y2 的j點的曼哈頓距離為 d i j x1 x2 y1 y2 include using ...