Find a way--hdu2612
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2612
广搜题
注意:可能存在一个@两人都不能达到;
3 3
Y#@
.M#
@..
1 #include<iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<algorithm> 5 #include<queue> 6 #include<stdlib.h> 7 #define inf 0x6ffffff 8 using namespace std; 9 10 #define min(a,b) (a>b?b:a) 11 12 #define N 205 13 14 int vis[N][N],m,n,b[N][N],dir[4][2]={ {1,0},{-1,0},{0,1},{0,-1} }; 15 char maps[N][N]; 16 17 struct node 18 { 19 int x,y,step; 20 }; 21 22 void bfs(node s) 23 { 24 queue<node> Q; 25 node q; 26 s.step=0; 27 Q.push(s); 28 vis[s.x][s.y]=1; 29 30 while(Q.size()) 31 { 32 q=Q.front(); 33 Q.pop(); 34 if(maps[q.x][q.y]=='@') 35 { 36 b[q.x][q.y]+=q.step; 37 } 38 for(int i=0;i<4;i++) 39 { 40 s.x=q.x+dir[i][0]; 41 s.y=q.y+dir[i][1]; 42 if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&vis[s.x][s.y]==0&&maps[s.x][s.y]!='#') 43 { 44 vis[s.x][s.y]=1; 45 s.step=q.step+1; 46 Q.push(s); 47 } 48 } 49 } 50 } 51 52 int main() 53 { 54 int i,j; 55 node s1,s2; 56 while(scanf("%d%d",&n,&m)!=EOF) 57 { 58 memset(maps,0,sizeof(maps)); 59 memset(b,0,sizeof(b)); 60 memset(vis,0,sizeof(vis)); 61 62 for(i=0;i<n;i++) 63 { 64 for(j=0;j<m;j++) 65 { 66 cin>>maps[i][j]; 67 if(maps[i][j]=='Y') 68 { 69 s1.x=i;s1.y=j; 70 } 71 if(maps[i][j]=='M') 72 { 73 s2.x=i;s2.y=j; 74 } 75 } 76 } 77 78 bfs(s1); 79 memset(vis,0,sizeof(vis)); 80 bfs(s2); 81 int Min=inf; 82 for(i=0;i<n;i++) 83 { 84 for(j=0;j<m;j++) 85 { 86 if(b[i][j]!=0)//不能写成if(maps[i][j]=='@',原因在上面) 87 { 88 Min=min(Min,b[i][j]); 89 } 90 } 91 } 92 printf("%d\n",Min*11); 93 } 94 return 0; 95 }