poj3026(Borg Maze)

  题目大意:

在银河系中有一强大生物个体Borg,每个个体之间都有一种联系。让我们帮忙写个程序扫描整个迷宫并同化隐藏在迷宫的相异个体的最小代价。
A 代表相异个体。空格代表什么没有,#代表障碍,S为开始点。扫描可以上下左右。
测试数据:
2
6 5
##### 
#A#A##
# # A#
#S  ##
##### 
7 7
#####  
#AAA###
#    A#
# S ###
#     #
#AAA###
#####  


解题思路:

简化题意就是从最少需要多少步将S和所有的A联系起来.第一组事例:S->A(1,1)两步+S->A(1,3)四步+A(1,3)->A(2,4)两步=8步。
这题的实质是最小生成树,然后实在搜索中实现最小生成树。因为是求最小的步数,所以用到广搜,我的思路是先将S的坐标进入BFS,将S到所有A的距离记录lowcost数组,然后从lowcost数组里找到最小的一个距离,然后记录其坐标,将其坐标进入到BFS,然后从该坐标搜索到其他A的距离更新lowcost,使其始终保存到各个A最小的距离。最后输出所有距离即可。实质是dijstra思想。
还有一点就是再输入m,n的时候可能有很多个空格,所以用一个getchar()是不行的。需要用一个数组c将所有的空格gets(c)。出来。这样才能正确的建图。

代码:
  1 #include <algorithm>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cstdio>
  7 #include <string>
  8 #include <bitset>
  9 #include <vector>
 10 #include <queue>
 11 #include <stack>
 12 #include <cmath>
 13 #include <list>
 14 //#include <map>
 15 #include <set>
 16 using namespace std;
 17 /***************************************/
 18 #define ll long long
 19 #define int64 __int64
 20 /***************************************/
 21 const int INF = 0x7f7f7f7f;
 22 const double eps = 1e-8;
 23 const double PIE=acos(-1.0);
 24 const int d1x[]= {0,-1,0,1};
 25 const int d1y[]= {-1,0,1,0};
 26 const int d2x[]= {0,-1,0,1};
 27 const int d2y[]= {1,0,-1,0};
 28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
 29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
 30 /***************************************/
 31 void openfile()
 32 {
 33     freopen("data.in","rb",stdin);
 34     freopen("data.out","wb",stdout);
 35 }
 36 /**********************华丽丽的分割线,以上为模板部分*****************/
 37 char map[100][100];
 38 int lowcost[100][100];
 39 int vis[100][100];
 40 int vis1[100][100];
 41 int cnt[100][100];
 42 int x[105],y[105];
 43 int d;
 44 int sum;
 45 int miin;
 46 int m,n;
 47 int ce1;
 48 int cnt1;
 49 int BFS(int x1,int y1)
 50 {
 51     int i,j;
 52     queue<int >Q;
 53     Q.push(x1);
 54     Q.push(y1);
 55     int v1,v2;
 56     int sum1=0;
 57     memset(vis,0,sizeof(vis));
 58     memset(cnt,0,sizeof(cnt));
 59     while(!Q.empty())
 60     {
 61         v1=Q.front();
 62         Q.pop();
 63         v2=Q.front();
 64         Q.pop();
 65         if (vis[v1][v2]==-1)
 66             continue;
 67         if (map[v1][v2]=='A'&&!vis1[v1][v2])
 68         {
 69             if (cnt[v1][v2]<lowcost[v1][v2])
 70             {
 71                 lowcost[v1][v2]=cnt[v1][v2];
 72             }
 73             sum1++;
 74             if (sum1==cnt1-d)
 75             {
 76                 return 0;
 77             }
 78         }
 79         vis[v1][v2]=-1;
 80         if (v1>=0&&v1<n&&v2>=0&&v2<m)
 81         {
 82             if (v1-1>=0&&map[v1-1][v2]!='#'&&vis[v1-1][v2]!=-1)
 83             {
 84                 Q.push(v1-1);
 85                 Q.push(v2);
 86                 cnt[v1-1][v2]=cnt[v1][v2]+1;
 87             }
 88             if (v1+1<n&&map[v1+1][v2]!='#'&&vis[v1+1][v2]!=-1)
 89             {
 90                 Q.push(v1+1);
 91                 Q.push(v2);
 92                 cnt[v1+1][v2]=cnt[v1][v2]+1;
 93             }
 94             if (v2-1>=0&&map[v1][v2-1]!='#'&&vis[v1][v2-1]!=-1)
 95             {
 96                 Q.push(v1);
 97                 Q.push(v2-1);
 98                 cnt[v1][v2-1]=cnt[v1][v2]+1;
 99             }
100             if (v2+1<m&&map[v1][v2+1]!='#'&&vis[v1][v2+1]!=-1)
101             {
102                 Q.push(v1);
103                 Q.push(v2+1);
104                 cnt[v1][v2+1]=cnt[v1][v2]+1;
105             }
106         }
107     }
108 }
109 int main()
110 {
111     int max;
112     int cas;
113     scanf("%d",&cas);
114     while(cas--)
115     {
116         scanf("%d%d",&m,&n);
117         char c[50];
118         int i,j;
119         cnt1=0;
120         d=0;
121         max=0;
122         for(i=0; i<n; i++)
123             for(j=0; j<m; j++)
124                 lowcost[i][j]=INF;
125         for(i=0; i<n; i++)
126         {
127             gets(c);
128             for(j=0; j<m; j++)
129             {
130                 scanf("%c",&map[i][j]);
131                 if (map[i][j]=='A'||map[i][j]=='S')
132                 {
133                     if (map[i][j]=='S')
134                     {
135                         x[d]=i;
136                         y[d]=j;
137                         d++;
138                     }
139                     cnt1++;
140                 }
141             }
142         }
143         memset(vis1,0,sizeof(vis1));
144         for(ce1=0,j=0; j<d; j++)
145         {
146             BFS(x[j],y[j]);
147             for(miin=INF,i=0; i<n; i++)
148                 for(int k=0; k<m; k++)
149                 {
150                     if (lowcost[i][k]<miin&&!vis1[i][k])
151                     {
152                         miin=lowcost[i][k];
153                         x[d]=i;
154                         y[d]=k;
155                     }
156                 }
157             vis1[x[d]][y[d]]=1;
158             d++;
159             max+=miin;
160             if (d==cnt1)
161                 break;
162         }
163         printf("%d
",max);
164     }
165     return 0;
166 }
View Code


 
屌丝终有逆袭日,*******。
原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3837317.html