Find a way HDU - 2612
阿新 • • 發佈:2021-01-10
考察:bfs
WA了n次結果發現是m寫成了n真是無極鮁魚
思路:
兩次bfs,分別統計他們到地圖上每一個點的最小時間,在KFC處取最小值即可
不知道能不能讓他們同時走,這種寫法我不會
易錯:
存在他們不能到達的KFC,所以不能簡單地只考慮最小值
1 #include <iostream> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 const int N = 210; 6 int n,m,xx[4]={-1,1,0,0},yy[4] = {0,0,-1,1},time[N][N][2]; 7 char mp[N][N]; 8 bool vis[N][N][2]; 9 struct Node{ 10 int x,y,d; 11 }; 12 void bfs(Node t,int id) 13 { 14 vis[t.x][t.y][id] = 1; 15 queue<Node> q; 16 q.push(t); 17 while(!q.empty()) 18 { 19 Node it = q.front(); 20 q.pop(); 21 for(int i=0;i<4;i++) 22 { 23 int dx = it.x+xx[i],dy = it.y+yy[i]; 24 if(dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dx][dy][id]&&mp[dx][dy]!='#') 25 { 26 vis[dx][dy][id] = 1; 27 time[dx][dy][id] = it.d+1; 28 Node s; s.x = dx,s.y = dy,s.d = it.d+1; 29 q.push(s); 30 } 31 } 32 } 33 } 34 int main() 35 { 36 // freopen("in.txt","r",stdin); 37 while(scanf("%d%d",&n,&m)!=EOF) 38 { 39 memset(vis,0,sizeof(vis)); 40 memset(time,0,sizeof(time)); 41 Node ys,ms; 42 int ans = 0x3f3f3f; 43 for(int i=0;i<n;i++){ 44 for(int j=0;j<m;j++){ 45 cin>>mp[i][j]; 46 if(mp[i][j]=='Y') ys.x=i,ys.y=j,ys.d=0; 47 else if(mp[i][j]=='M') ms.x=i,ms.y=j,ms.d=0; 48 } 49 } 50 bfs(ys,0); 51 bfs(ms,1); 52 for(int i=0;i<n;i++){ 53 for(int j=0;j<m;j++){ 54 if(mp[i][j]=='@'&&vis[i][j][0]&&vis[i][j][1]) ans = min(time[i][j][0]+time[i][j][1],ans); 55 } 56 } 57 printf("%d\n",ans*11); 58 } 59 return 0; 60 }