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;}