1086 最小水源 杭电

来源:互联网 发布:nfc手机读取身份证软件 编辑:程序博客网 时间:2024/06/11 11:34
#include<stdio.h>int set[3000];int find(int x){ while(set[x]!=x)  x=set[x]; return x;}void shu(int x,int y){ int rx,ry; rx=find(x); ry=find(y); if(rx!=ry)  set[rx]=ry;}int main(){ int i,n,m,j,p,x,y; char b[55][55]; char a[11][5]={"1010","1001","0110","0101","1100","0011","1011","1110","0111","1101","1111"};      while(scanf("%d%d",&n,&m),n!=-1&&m!=-1)   {    for(i=1;i<3000;i++)    {     set[i]=i;    }    for(i=1;i<=n;i++)        scanf("%s",b[i]);for(i=1;i<=n;i++){     for(j=0;j<m-1;j++)     {      x=b[i][j]-'A'+1;      y=b[i][j+1]-'A'+1;      if((a[x-1][3]-'0')+(a[y-1][2]-'0')==2)       shu((i-1)*m+j+1,(i-1)*m+j+2);     }    }    for(i=1;i<n;i++){     for(j=0;j<m;j++){      x=b[i][j]-'A'+1;      y=b[i+1][j]-'A'+1;      if((a[x-1][1]-'0')+(a[y-1][0]-'0')==2)       shu((i-1)*m+j+1,i*m+j+1);     }    }    p=0;    for(i=1;i<=n*m;i++){     if(set[i]==i)      p++;}    printf("%d\n",p);   }   return 0;} 

原创粉丝点击