本文主要是介绍hdu 1198 Farm Irrigation (并查集图形的部分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先根据题意上的图形,对map的各个方向赋值,油管道的方向赋值为一;
最后根据地形数组p详细记录了各个点各个方向上的信息;
最后先对行进行比较,将满足题意的进行合并,然后最一列一列的将满足题意的合并;
#include"stdio.h"
#include"string.h"
int pre[10000],p[600][600][4];
int map[11][4]={1,1,-1,-1, -1,1,1,-1, 1,-1,-1,1, -1,-1,1,1,
-1,1,-1,1, 1,-1,1,-1, 1,1,1,-1, 1,1,-1,1, 1,-1,1,1, -1,1,1,1, 1,1,1,1};
int find(int k)
{
if(k!=pre[k])
pre[k]=find(pre[k]);
return pre[k];
}
int main()
{
int m,n,i,j,k,x,y;
char a[1000][1000];
while(scanf("%d%d",&m,&n),m!=-1&&n!=-1)
{
memset(p,0,sizeof(p));
for(i=0;i<m*n;i++)
pre[i]=i;
for(i=0;i<m;i++)
{
scanf("%s",a[i]);
for(j=0;j<n;j++)
{
for(k=0;k<4;k++)
{
p[i][j][k]=map[a[i][j]-'A'][k];
}
}
}
for(i=0;i<m;i++)
for(j=0;j<n-1;j++)
{
if(p[i][j][2]==1&&p[i][j+1][0]==1)
{
x=find(i*n+j);
y=find(i*n+j+1);
if(x!=y)
pre[y]=x;
}
}
for(i=0;i<m-1;i++)
for(j=0;j<n;j++)
{
if(p[i][j][3]==1&&p[i+1][j][1]==1)
{
x=find(i*n+j);
y=find((i+1)*n+j);
if(x!=y)
pre[x]=y;
}
}
int sum=0;
for(i=0;i<m*n;i++)
if(pre[i]==i)
sum++;
printf("%d\n",sum);
}
return 0;
}
这篇关于hdu 1198 Farm Irrigation (并查集图形的部分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!