雙向廣度搜尋 拯救公主(一)

2021-07-07 04:23:06 字數 1607 閱讀 8960

時間限制: 1 sec  

記憶體限制: 128 mb [

提交][

狀態][

討論版]

公主被妖怪抓到了乙個山洞裡,為了盡快營救公主,王子決定不回城搬救兵去獨自營救。山洞為矩形且十分空曠,其中生活著k個妖怪。幸運的是這些妖怪晚上都會睡覺並且沒人守夜。但是若是離妖怪太近就會驚醒它,其他的妖怪也會被驚醒,所以我們要找一條距離所有妖怪都很遠的路。我們把山洞分為了n*m個格仔,走到相鄰的格仔(不含對角)王子需要一步,妖怪只佔乙個格仔的大小。王子希望你給他一條盡可能安全的路,你只需要告訴他,這條路上離妖怪最近的時候距離是多少(最少走k步可到則認為最近距離為k)。入口在1行1列,公主在n行m列。

n,m,k(地圖為n行*m列,k為妖怪個數)(1

之後有k行每行兩個數xi,yi(表示妖怪在xi行,yi列)

離妖怪最近的距離

3 3 2

1 33 1

1
離妖怪最近的距離

注意:走到哪個位置就計算到每個妖怪的距離,並取最小值,取這條路徑上的最小值的最大距離並輸出結果

#include#include#include#include#includeusing namespace std;

#define min(x,y) (x=1 && i<=n && j>=1 && j<=m && map[i][j]) return true;

else return false;}

int huan(int s,int d)

if(vis[now2.x][now2.y])

for(int i=0;i<4;i++)

tmp2.x=now2.x+c[i][0];

tmp2.y=now2.y+c[i][1];

tmp2.v=min(huan(tmp2.x,tmp2.y),now2.v);

if(check(tmp2.x,tmp2.y) && !vis2[tmp2.x][tmp2.y])}}

if(dd==1)

else if(dd==2)

else return 0;}

int main()

printf("%d\n",bfs(1,1));

}return 0;

}

執行時間為 : 420 ms

多給幾組測試資料:

(1):1000 1000 10

161 203

85 591

494 633

563 935

517 722

595 363

989 174

448 825

902 939

430 386

輸出為:98

(2)1000 1000 10

732 474

449 988

119 239

306 233

258 268

627 992

225 792

237 601

72 361

1 951

輸出為:232

雙向搜尋 DP 拯救公主(二)

時間限制 1 sec 記憶體限制 128 mb 提交 狀態 討論版 公主被妖怪抓到了乙個山洞裡,為了盡快營救公主,王子決定不回城搬救兵去獨自營救。山洞為矩形且十分空曠,其中生活著k個妖怪。幸運的是這些妖怪晚上都會睡覺並且沒人守夜。但是若是離妖怪太近就會驚醒它,其他的妖怪也會被驚醒,所以我們要找一條距...

廣度優先搜尋尋找最優路徑 以及雙向廣度搜尋演算法

這裡是poj1915上的一道在棋盤上搜尋走步路徑的題目 如下 使用bfs 通過這道題目我有如下的幾點總結 1 一開始我通過struct結構來表示每一步到達的座標位置,其中設定了乙個struct parent的指標,而不是改進後的int parent 但是在實際的除錯過程中,出現了非常奇怪的現象,被壓...

雙向廣度優先搜尋演算法

首先是廣度優先搜尋演算法 初始化visited陣列,將所有點的值設為false visited陣列用來儲存所有點的訪問情況 visited start true start為起始點 queuesearch 用來儲存待搜尋點的佇列 search.push start while search.empt...