計蒜客 蒜頭君回家(bfs)

2021-08-16 05:39:35 字數 2010 閱讀 1806

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

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

蒜頭君生活的城市可以看做是乙個 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 的網格,其中有道路有...