这道题目真是太麻烦了,设置了好多变量。对了,还参考了discuss中的空格的问题。
//11333524 c00h00g 3026 Accepted 680K 47MS G++ 2894B 2013-03-10 14:35:03
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<string.h>
using namespace std;
#define INF 0x7fffffff
//字符矩阵
char mat[55][55];
int x,y,n,k;
struct Node{
int x,y;
};
//A之间的距离
int dist[102][102];
//广搜过程中记录点是否访问过
int vis[55][55];
//方向数组
int dir[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
//记录某个位置对应node节点的下标
int index[55][55];
//广搜的过程中记录距离
int dd[55][55];
//记录距离lowcost
int lowcost[102];
int visited[102];
queue<Node> q;
void bfs(Node nd){
q.push(nd);
memset(vis,0,sizeof(vis));
dd[nd.x][nd.y]=0;
vis[nd.x][nd.y]=1;
while(!q.empty()){
Node tmp=q.front();q.pop();
for(int i=0;i<4;i++){
int xx=tmp.x+dir[i][0];
int yy=tmp.y+dir[i][1];
if(xx>=0&&xx<y&&yy>=0&&yy<x&&(mat[xx][yy]=='A'||mat[xx][yy]==' '||mat[xx][yy]=='S')&&vis[xx][yy]==0){
dd[xx][yy]=dd[tmp.x][tmp.y]+1;
vis[xx][yy]=1;
if(mat[xx][yy]=='A'||mat[xx][yy]=='S'){
dist[index[nd.x][nd.y]][index[xx][yy]]=dd[xx][yy];
dist[index[xx][yy]][index[nd.x][nd.y]]=dd[xx][yy];
}
Node ne;ne.x=xx;ne.y=yy;
q.push(ne);
}
}
}
}
//起点设置为0
int prim(){
int res=0,Min;
memset(visited,0,sizeof(visited));
visited[0]=1;
for(int i=1;i<k;i++)
lowcost[i]=dist[0][i];
int v;
for(int i=1;i<k;i++){
Min=INF;
for(int j=1;j<k;j++)
if(lowcost[j]<Min&&!visited[j]){
Min=lowcost[j];
v=j;
}
res+=Min;
visited[v]=1;
for(int j=1;j<k;j++)
if(lowcost[j]>dist[v][j]&&!visited[j])
lowcost[j]=dist[v][j];
}
return res;
}
int main(){
char aa[100];
while(scanf("%d",&n)!=EOF){
while(n--){
k=0;
scanf("%d%d",&x,&y);gets(aa);
for(int i=0;i<y;i++){
for(int j=0;j<x;j++){
scanf("%c",&mat[i][j]);
if(mat[i][j]=='A'||mat[i][j]=='S'){
index[i][j]=k;
k++;
}
}
getchar();
}
/*for(int i=0;i<y;i++){
for(int j=0;j<x;j++)
printf("%c",mat[i][j]);
printf("\n");
}*/
for(int i=0;i<k;i++)
for(int j=0;j<k;j++)
dist[i][j]=((i==j)?0:INF);
//开始bfs
for(int i=0;i<y;i++)
for(int j=0;j<x;j++)
if(mat[i][j]=='A'||mat[i][j]=='S'){
Node tmp;tmp.x=i;tmp.y=j;
bfs(tmp);
}
printf("%d\n",prim());
}
}
//system("pause");
return 0;
}