Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8086 | Accepted: 2703 |
Description
Input
Output
Sample Input
2 6 5 ##### #A#A## # # A# #S ## ##### 7 7 ##### #AAA### # A# # S ### # # #AAA### #####
Sample Output
8 11
Source
#include<stdio.h> #include<stdlib.h> #include<string.h> #define maxn 100000000 int n,tu[105][105],a[105][105],x,y,num; int usetu[105][105],use[105],d[105]; char ts[205]; typedef struct node { int tx,ty; int ceng; }node; node duilie[1000]; typedef struct nnode { int ttx,tty; }nnode; nnode zuobiao[205]; int head,end; void init() { int i,j; int k=2; scanf("%d%d",&x,&y); gets(ts); for(i=0;i<y;i++) { gets(ts); for(j=0;j<x;j++) { switch(ts[j]) { case '#':tu[i][j]=-1;break; case ' ':tu[i][j]=0;break; case 'S':tu[i][j]=1; zuobiao[1].ttx=i; zuobiao[1].tty=j;break; case 'A':tu[i][j]=k; zuobiao[k].ttx=i; zuobiao[k].tty=j; k++;break; default:break; }; } } num=k-1; for(i=1;i<=num;i++) for(j=1;j<=num;j++) a[i][j]=maxn; memset(a,0,sizeof(a)); } void bfs(int hao,int beginx,int beginy) { int i,j; int tceng,temx,temy; int temhao; duilie[0].ceng=0; duilie[0].tx=beginx; duilie[0].ty=beginy; head=0; end=1; usetu[beginx][beginy]=1; memset(usetu,0,sizeof(usetu)); while(end!=head) { tceng=duilie[head].ceng; temx=duilie[head].tx; temy=duilie[head].ty; head=(head+1)%1000; if(tu[temx][temy]>hao) { temhao=tu[temx][temy]; a[hao][temhao]=a[temhao][hao]=tceng; } if(tu[temx-1][temy]!=-1&&!usetu[temx-1][temy]) { duilie[end].ceng=tceng+1; duilie[end].tx=temx-1; duilie[end].ty=temy; end=(end+1)%1000; usetu[temx-1][temy]=1; } if(tu[temx+1][temy]!=-1&&!usetu[temx+1][temy]) { duilie[end].ceng=tceng+1; duilie[end].tx=temx+1; duilie[end].ty=temy; end=(end+1)%1000; usetu[temx+1][temy]=1; } if(tu[temx][temy-1]!=-1&&!usetu[temx][temy-1]) { duilie[end].ceng=tceng+1; duilie[end].tx=temx; duilie[end].ty=temy-1; end=(end+1)%1000; usetu[temx][temy-1]=1; } if(tu[temx][temy+1]!=-1&&!usetu[temx][temy+1]) { duilie[end].ceng=tceng+1; duilie[end].tx=temx; duilie[end].ty=temy+1; end=(end+1)%1000; usetu[temx][temy+1]=1; } } } void prim() { int i,j; int minc,mind; memset(use,0,sizeof(use)); memset(d,0,sizeof(d)); use[1]=1; d[1]=0; for(i=2;i<=num;i++) d[i]=a[1][i]; for(j=0;j<num-1;j++) { minc=maxn; for(i=1;i<=num;i++) { if(!use[i]&&minc>d[i]) { minc=d[i]; mind=i; } } if(minc!=maxn) { use[mind]=1; for(i=1;i<=num;i++) { if(!use[i]&&d[i]>a[mind][i]) d[i]=a[mind][i]; } } } } void print() { int i,j; int sum=0; for(i=1;i<=num;i++) sum+=d[i]; printf("%d\n",sum); } int main() { int i,j; while(scanf("%d",&n)!=EOF&&n) { while(n--) { init(); for(i=1;i<=num;i++) bfs(i,zuobiao[i].ttx,zuobiao[i].tty); prim(); print(); } } return 0; }