HDU 2612 Find a way(雙層BFS)
阿新 • • 發佈:2018-12-02
題目大概的意思就是兩個人Y和M約在KFC見面,找到一家KFC使得兩個人到達時的距離之和最短,並且Y不能經過M的出發地,M不能經過Y的出發地。
思路也很清晰,用兩次BFS,找出Y和M分別到每個KFC所需要的時間,然後把兩個人到達每個KFC需要的時間加起來,找出最小值,這個最小值就是題目要求的值,附程式碼如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char mp[1010][1010]; int vis[1010][1010],step1[1010][1010],step2[1010][1010],n,m; int mv[4][2] = {0,1,0,-1,1,0,-1,0}; typedef pair <int,int> P; void bfs(int a,int b,int c,int d,int step[1010][1010]) { P que[220*220]; int frt = 0,til = 0; que[til].first = a; que[til++].second = b; vis[a][b] = 1; step[a][b] = 0; while(frt < til) { P p = que[frt]; int next_x,next_y; for(int i = 0;i < 4; i++) { next_x = p.first + mv[i][0]; next_y = p.second + mv[i][1]; if(next_x == c && next_y == d) continue; if(next_x >= 0 && next_x < n && next_y >= 0 && next_y < m && mp[next_x][next_y] != '#' && !vis[next_x][next_y]) { que[til].first = next_x; que[til].second = next_y; vis[next_x][next_y] = 1; til++; step[next_x][next_y] = step[p.first][p.second] + 1; } } frt++; } } int main() { int yx,yy,mx,my; while(scanf("%d %d",&n,&m) != EOF) { memset(vis,0,sizeof(vis)); getchar(); for(int i = 0;i < n; i++) { scanf("%s",mp[i]); getchar(); for(int j = 0;j < m; j++) { if(mp[i][j] == 'Y') yx = i,yy = j; if(mp[i][j] == 'M') mx = i,my = j; } } bfs(mx,my,yx,yy,step1); memset(vis,0,sizeof(vis)); bfs(yx,yy,mx,my,step2); int ans = 0x3f3f3f3f; for(int i = 0;i < n; i++) { for(int j = 0;j < m; j++) { if(mp[i][j] == '@') { // printf("%d %d %d %d\n",i,j,step1[i][j],step2[i][j]); int he = step1[i][j] + step2[i][j]; if(he < ans) ans = he; } } } printf("%d\n",ans * 11); } return 0; }