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 }

 

你可能感兴趣的:(find)