怒了! getchar()竟然会WA。真是无语了!!!死都检查不出来逻辑哪儿错了。
BFS+Prim。
#include <iostream>
#include <stdlib.h>
#include <list>
#include <map>
#include <string.h>
#include <queue>
#include <algorithm>
#include <stdio.h>
using namespace std;
int row,col;
char maze[51][51];
int D[2500];
int w[2500][2500];
int dist[50][50];
int index[50][50];
int visit[50][50];
queue<int> que_i;
queue<int> que_j;
int n;
void bfs(int i,int j,int len){
int bias_i[] = {-1,1,0,0};
int bias_j[] = {0,0,-1,1};
memset(visit,0,sizeof(visit));
memset(dist,0,sizeof(dist));
visit[i][j] = 1;
que_i.push(i);
que_j.push(j);
dist[i][j] = 0;
while(!que_i.empty()){
int x = que_i.front();
int y = que_j.front();
que_i.pop();
que_j.pop();
if(index[x][y]>0){
w[index[i][j]-1][index[x][y]-1] = dist[x][y];
}
for(int k=0;k<4;++k){
int ti = x+bias_i[k];
int tj = y+bias_j[k];
if(maze[ti][tj]!='#' && !visit[ti][tj]){
que_i.push(ti);
que_j.push(tj);
dist[ti][tj] = dist[x][y]+1;
visit[ti][tj]=1;
}
}
}
}
bool cmp(int x, int y){return D[x]<D[y];}
void process(){
n = 1;
memset(index,0,sizeof(index));
for(int i=0;i<row;++i){
for(int j=0;j<col;++j){
if(maze[i][j]=='A' || maze[i][j]=='S')
index[i][j] = n++;
}
}
--n;
for(int i=1;i<row-1;++i){
for(int j=1;j<col-1;++j){
if(maze[i][j]=='A' || maze[i][j]=='S')
bfs(i,j,0);
}
}
memcpy(D,w[0],sizeof(D));
D[0] = 0;
list<int> L;
int i = n-1;
while(i>0)
L.push_back(i--);
list<int>::iterator it;
while(!L.empty()){
it = min_element(L.begin(),L.end(),cmp);
i = *it;
L.erase(it);
for(it=L.begin();it!=L.end();++it)
if(D[*it]>w[i][*it])
D[*it] = w[i][*it];
}
int res = 0;
for(i=1;i<n;++i)
res += D[i];
cout<<res<<endl;
}
int main(){
int testcase;
cin>>testcase;
while(testcase--){
cin>>col>>row;
char tmp[10];
gets(tmp);
for(int i=0;i<row;++i)
gets(maze[i]);
process();
}
}