Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 3255 Accepted: 1044

      本题其实并不难,就是题意令人太难理解,后来才看出来,题意的意思是从一个出发点‘S’出发寻找‘A’,但是可以并行查找,即在开始的时候就分组,或者是找到一个‘A’以后再分组。求最小的距离。其实就是一个最小生成树问题,只不过加了一个BFS罢了!

代码:

 

1 #include<stdio.h>
2 #include<string.h>
3 #include<queue>
4  using namespace std;
5  int m,nn;char map[55][55];
6 typedef struct node
7 {
8 int x,y,s;
9 }NODE;
10 typedef struct pnode
11 {
12 int s,x,y;
13 bool operator <(const pnode &a )const
14 {
15 return a.s<s;
16 }
17 }PNODE;
18 NODE cur,next;PNODE pcur;
19 int bfs(int x,int y)
20 {
21 priority_queue<PNODE> pqu;
22 queue<NODE> qu;
23 int visit[55][55];
24 memset(visit,0,sizeof(visit));
25 int mark[55][55],sum=0,i,tag=0;
26 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
27 pcur.x=x;pcur.y=y;
28 pcur.s=0;
29 pqu.push(pcur);
30 while(!pqu.empty())
31 {
32 pcur=pqu.top();
33 while(visit[pcur.x][pcur.y])
34 {
35 pqu.pop();
36 if(pqu.empty ())
37 {
38 tag=1;
39 break;
40 }
41 pcur=pqu.top();
42 }
43 if(tag)
44 return sum;
45 pqu.pop();
46 visit[pcur.x][pcur.y]=1;
47 sum+=pcur.s;
48 cur.x=pcur.x;
49 cur.y=pcur.y;
50 cur.s=0;
51 qu.push(cur);
52 memset(mark,0,sizeof(mark));
53 mark[cur.x][cur.y]=1;
54 while(!qu.empty())
55 {
56 cur=qu.front();
57 qu.pop();
58 if(!visit[cur.x][cur.y] && map[cur.x][cur.y]=='A')
59 {
60 pcur.x=cur.x;
61 pcur.y=cur.y;
62 pcur.s=cur.s;
63 pqu.push(pcur);
64 }
65 for(i=0;i<4;i++)
66 {
67 next.x=cur.x+dir[i][0];
68 next.y=cur.y+dir[i][1];
69 if(next.x>=1 && next.x<=m && next.y>=1 && next.y<=nn && !mark[next.x][next.y] && map[next.x][next.y]!='#')
70 {
71 mark[next.x][next.y]=1;
72 next.s=cur.s+1;
73 qu.push(next);
74 }
75 }
76 }
77 }
78 return sum;
79 }
80 int main()
81 {
82 int n,i,j,sx,sy;
83 scanf("%d",&n);
84 while(n--)
85 {
86 scanf("%d%d",&nn,&m);
87 for(i=1;i<=m;i++)
88 {
89 while(getchar()!='\n');
90 for(j=1;j<=nn;j++)
91 {
92 scanf("%c",&map[i][j]);
93 if(map[i][j]=='S')
94 {
95 sx=i;sy=j;
96 }
97 }
98 }
99 printf("%d\n",bfs(sx,sy));
100 }
101 return 0;
102 }