# include <stdio.h>
# include <algorithm>
using namespace std;
int father[3000];
int map[55][55][5];
int find(int x)
{
if(x==father[x])
return x;
return father[x]=find(father[x]);
}
int s[15][4]={{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}};//上下左右的顺序 1表示通 0 不通
int main()
{
int m,n,i,j,k,cot,x1,x2;
char a[55][55];
while(~scanf("%d%d",&m,&n))
{
if(n==-1&&m==-1)
break;
for(i=0;i<n*m;i++)//初始化节点
father[i]=i;
for(i=0;i<m;i++)
{
scanf("%s",a[i]);
for(j=0;j<n;j++)
{
for(k=0;k<4;k++)
{
map[i][j][k]=s[a[i][j]-'A'][k];//确定管道类型
}
}
}
for(i=0;i<m;i++)//判断左右是否相通
{
for(j=0;j<n-1;j++)
{
if(map[i][j][3]==1&&map[i][j+1][2]==1)
{
x1=find(i*n+j);
x2=find(i*n+j+1);
if(x1!=x2)
{
father[x1]=x2;
}
}
}
}
for(i=0;i<m-1;i++)//判断上下是否相通
{
for(j=0;j<n;j++)
{
if(map[i][j][1]==1&&map[i+1][j][0]==1)
{
x1=find(i*n+j);
x2=find((i+1)*n+j);
if(x1!=x2)
{
father[x1]=x2;
}
}
}
}
cot=0;
for(i=0;i<n*m;i++)//需要节点数
if(father[i]==i)
cot++;
printf("%d\n",cot);
}
return 0;
}
hdu 1198 Farm Irrigation (并查集)
最新推荐文章于 2021-10-25 19:11:05 发布