Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11549 | Accepted: 3797 |
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
这道题就是最小生成树;
以字母为结点,字母之间的距离为权重;
这里还要使用bfs来求字母之间的距离;
#include<iostream> #include<cstdlib> #include<string> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<stack> #include<queue> #include<iomanip> #include<map> #include<set> #define pi 3.14159265358979323846 using namespace std; const int INF=0x3f3f3f3f; struct Pos { int x; int y; int len; }; int x,y; char maze[51][51]; int id[51][51];//储存结点的编号 int dx[]={1,-1,0,0}; int dy[]={0,0,1,-1}; bool vis[51][51];//广搜的标记数组 int dis[105][105];//字母之中的最短距离 void bfs(int a,int b) { queue<Pos> q; memset(vis,0,sizeof(vis)); Pos pos; pos.x=a; pos.y=b; pos.len=0; q.push(pos); vis[a][b]=1; while(!q.empty()) { Pos cur=q.front(); //cout<<cur.len<<endl; q.pop(); if(id[cur.x][cur.y]!=-1) dis[id[pos.x][pos.y]][id[cur.x][cur.y]]=cur.len; for(int i=0;i<4;++i) { Pos temp; temp.x=cur.x+dx[i]; temp.y=cur.y+dy[i]; if(temp.x<0||temp.x>=y||temp.y<0||temp.y>=x) continue; if(vis[temp.x][temp.y]||maze[temp.x][temp.y]=='#') continue; vis[temp.x][temp.y]=1; temp.len=cur.len+1; //cout<<temp.len<<endl; q.push(temp); } } } int prim(int cnt) { bool v[105]; int d[105]; int ans=0; memset(v,0,sizeof(v)); for(int i=0;i<cnt;++i) { d[i]=dis[0][i]; //cout<<d[i]<<endl; } v[0]=1; d[0]=0; for(int i=0;i<cnt-1;++i) { int flag,zmin=INF; for(int j=0;j<cnt;++j) { if(!v[j]&&d[j]<zmin) { flag=j; zmin=d[j]; //cout<<zmin<<endl; } } v[flag]=1; ans+=zmin; //cout<<ans<<endl; for(int j=0;j<cnt;++j) { if(!v[j]&&d[j]>dis[flag][j]) d[j]=dis[flag][j]; } } return ans; } int main() { int N; char tmp[200]; scanf("%d",&N); while(N--) { scanf("%d %d",&x,&y); //这里为了去空格,防坑 gets(tmp); memset(id,-1,sizeof(id)); int cnt=0; for(int i=0;i<y;++i) { gets(maze[i]); //编号 for(int j=0;j<x;++j) { if(maze[i][j]=='A'||maze[i][j]=='S') id[i][j]=cnt++; } } for(int i=0;i<y;++i) for(int j=0;j<x;++j) { if(maze[i][j]=='A'||maze[i][j]=='S') bfs(i,j); } int ans=prim(cnt); printf("%d\n",ans); } return 0; }