蒜頭君回家(bfs)

2021-09-23 06:08:50 字數 1659 閱讀 9627

蒜頭君要回家,但是他家的鑰匙在他的朋友花椰妹手裡,他要先從花椰妹手裡取得鑰匙才能回到家。花椰妹告訴他:「你家的鑰匙被我複製了很多個,分別放在不同的地方。」

蒜頭君希望能盡快回到家中,他首先需要取得任意一把鑰匙,請你幫他計算出回家所需要的最短路程。

蒜頭君生活的城市可以看做是乙個 n×m  的網格,其中有道路有障礙,鑰匙和家所在的地方可以看做是道路,可以通過。蒜頭君可以在城市中沿著上下左右 4 個方向移動,移動乙個格仔算做走一步。

輸入格式

第一行有兩個整數 n ,m 。城市的地圖是 n  行 m  列。(1≤n,m≤2000 )

接下來的 n  行,每行 m 個字元,代表城市的地圖。'.'代表道路,'#'代表障礙物,'s'代表蒜頭君所在的位置,'t'代表蒜頭家的位置,'p'代表鑰匙的位置。除了障礙物以外,別的地方都可以通過。題目保證蒜頭君至少有一條路徑可以順利拿到鑰匙並且回家。

輸出格式

輸出蒜頭回家要走的最少步數,佔一行。

輸出時每行末尾的多餘空格,不影響答案正確性

要求使用「檔案輸入輸出」的方式解題,輸入檔案為 home.in,輸出檔案為 home.out

樣例輸入

8 10

p.####.#p#

..#..#...#

..#t##.#.#

..........

..##.#####

..........

#####...##

###....s##

樣例輸出

21思路:一開始我先bfs了一遍找到了離蒜頭君最近的鑰匙的位置,再以這個鑰匙為起點,bfs找出到終點的最小距離,兩個距離一加起來就是答案,可是怎麼也跑不出來樣例,後來仔細考慮了一下,這樣的話不能保證這個和是最小的。

所以就先把各個鑰匙的位置存起來,分別從蒜頭君的位置和終點的位置bfs ,記錄下他倆到所有點的距離,然後就是把蒜頭君到某個鑰匙的距離和終點到鑰匙的距離加起來,找到最小的這個和,即是答案

#include#include#include#include#include#include#include#include#include#includeconst int maxn=1e5+5;

typedef long long ll;

using namespace std;

char mp[2005][2005];

int vis[2005][2005];

int step1[2005][2005];

int step2[2005][2005];

int n,m;

struct node;

vectorv;

int mov[5][2]=,,,};

void bfs(node tmp,int flag)

else

} }

}int main()

if(mp[i][j]=='t')

if(mp[i][j]=='p')

} }bfs(fs,1);

memset(vis,0,sizeof(vis));

bfs(ft,0);

int ans=0x3f;

for(int i=0;iprintf("%d\n",ans);

return 0;

}

bfs 蒜頭君回家

ans 0 表示起點到各點的最短距離 ans 1 表示終點到各點的最短距離 int ans 2 2005 2005 bool vis 2 2005 2005 char num 2005 2005 int n,m,sx,sy,tx,ty,result 1e9 int dx int dy bool ch...

計蒜客 蒜頭君回家(bfs)

蒜頭君要回家,但是他家的鑰匙在他的朋友花椰妹手裡,他要先從花椰妹手裡取得鑰匙才能回到家。花椰妹告訴他 你家的鑰匙被我複製了很多個,分別放在不同的地方。蒜頭君希望能盡快回到家中,他需要首先取得任意一把鑰匙,請你幫他計算出回家所需要的最短路程。蒜頭君生活的城市可以看做是乙個 n m 的網格,其中有道路有...

計蒜客 蒜頭君回家 bfs

題目鏈結 bfs廣搜,從s到p 從t到p的所有求最小值輸出就好,需要注意的地方 採用了stl的map,map預設按key值排序,故當使用自定義結構體時,應當在結構體內重構比較運算子,一開始只是簡單比較了point的x值,後來插入有誤,檢查後發現當x值相等時便覆蓋了相同x值的對映 採用的point結構...