蒜頭君要回家,但是他家的鑰匙在他的朋友花椰妹手裡,他要先從花椰妹手裡取得鑰匙才能回到家。花椰妹告訴他:「你家的鑰匙被我複製了很多個,分別放在不同的地方。」
蒜頭君希望能盡快回到家中,他需要首先取得任意一把鑰匙,請你幫他計算出回家所需要的最短路程。
蒜頭君生活的城市可以看做是乙個 n×m 的網格,其中有道路有障礙,鑰匙和家所在的地方可以看做是道路,可以通過。蒜頭君可以在城市中沿著上下左右 4 個方向移動,移動乙個格仔算做走一步。
輸入格式
第一行有兩個整數 n,m。城市的地圖是 n 行 m 列。(1≤n,m≤2000)
接下來的 n 行,每行 m 個字元,代表城市的地圖。』.』 代表道路,』#』 代表障礙物,』s』 代表蒜頭君所在的位置,』t』 代表蒜頭家的位置,』p』代表鑰匙的位置。除了障礙物以外,別的地方都可以通過。(題目保證蒜頭君至少有一條路徑可以順利拿到鑰匙並且回家)
輸出格式
輸出蒜頭回家要走的最少步數,佔一行。
樣例輸入
樣例輸出8
10p.####.
#p#..#..
#...#
..#t##.
#.#..........
..##.#####
..........
#####...##
###....s##
解題說明:這裡我們並不是先搜尋所有鑰匙,再從每個每個鑰匙出發找終點,這樣肯定會超時。
標誌的問題,多加一維,已經有鑰匙了有沒走過,和沒有鑰匙的走沒走過。
ac**:
#include#include#include#include#define maxl 2010
using namespace std;
int n,m;
int a[maxl][maxl],vist[maxl][maxl][2];
int cg[4][2]=,,,};
struct point
};int bfs(int x,int y)
else if(a[tx][ty]=='t'&&po.flag)
else q.push(point(tx,ty,po.foot+1,po.flag));
}} }
}int main()
}} printf("%d\n",bfs(bx,by));
return 0;
}
執行超時**:
#include#include#include#include#include#define maxl 2048
using namespace std;
int n,m,ans=0,flag=0;
int a[maxl][maxl],mark[maxl][maxl];long long b[maxl][maxl];
int cgx[4]=;
int cgy[4]=;
long long mn=100000000000007;
int ex,ey;
map>mp;
struct point
};struct ppz[maxl*maxl];
void bfs(int x,int y,int index)
q.push(point(x,y));
mark[x][y]=1;
while(!q.empty())
if(flag&&a[tx][ty]==6)
}}
}return ;
}int main()
else if(ip1=='.')a[i][j]=1;
else if(ip1=='p')
else if(ip1=='t')
else a[i][j]=0;
} } bfs(bx,by,0);
for(int i=0;i}
} printf("%d\n",mn);
return 0;
}
計蒜客 蒜頭君回家 bfs
題目鏈結 bfs廣搜,從s到p 從t到p的所有求最小值輸出就好,需要注意的地方 採用了stl的map,map預設按key值排序,故當使用自定義結構體時,應當在結構體內重構比較運算子,一開始只是簡單比較了point的x值,後來插入有誤,檢查後發現當x值相等時便覆蓋了相同x值的對映 採用的point結構...
計蒜客 蒜頭君回家
樣例輸入 8 10 p.p t s 樣例輸出 思路用兩次bfs,第一次計算出起點到p的距離,第二次計算出t到p的距離,然後迴圈取最小值。但是wa了很多次,找了很久,發現是vis判斷的問題,導致乙個資料更新多次。ac include include include include using name...
蒜頭君回家(bfs)
蒜頭君要回家,但是他家的鑰匙在他的朋友花椰妹手裡,他要先從花椰妹手裡取得鑰匙才能回到家。花椰妹告訴他 你家的鑰匙被我複製了很多個,分別放在不同的地方。蒜頭君希望能盡快回到家中,他首先需要取得任意一把鑰匙,請你幫他計算出回家所需要的最短路程。蒜頭君生活的城市可以看做是乙個 n m 的網格,其中有道路有...