蒜頭君要回家,但是他家的鑰匙在他的朋友花椰妹手裡,他要先從花椰妹手裡取得鑰匙才能回到家。花椰妹告訴他:「你家的鑰匙被我複製了很多個,分別放在不同的地方。」
蒜頭君希望能盡快回到家中,他首先需要取得任意一把鑰匙,請你幫他計算出回家所需要的最短路程。
蒜頭君生活的城市可以看做是乙個 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結構...