血色先鋒隊題解

2021-10-19 12:44:30 字數 2502 閱讀 9931

~~手動分割~~

這是此題的標準解法。

先將給定的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 ...