hdu 1198 Farm Irrigation
并查集 过了
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
bool pipe[][4]= {1,1,0,0,
0,1,1,0,
1,0,0,1,
0,0,1,1,
0,1,0,1,
1,0,1,0,
1,1,1,0,
1,1,0,1,
1,0,1,1,
0,1,1,1,
1,1,1,1
};
int n, m;
char map[55][55];
int dx[]= {0,-1,0,1};
int dy[]= {-1,0,1,0};
int fa[2601];
bool vis[2601];
void init()
{
int i;
for(i=0; i<n*m; i++)
fa[i]=i;
}
bool can(int x,int y)
{
if(x<0||y<0||x>=n||y>=m) return false;
return true;
}
int find(int x)
{
if(x==fa[x]) return fa[x];
return fa[x]=find(fa[x]);
}
void solv(int x,int y)
{
int i, nx, ny, num1, num2, f1, f2;
num1=x*m+y;
int aa, bb;
aa=map[x][y]-'A';
for(i=0; i<4; i++)
{
nx=dx[i]+x, ny=dy[i]+y;
if(!can(nx,ny)) continue;
num2=nx*m+ny;
bb=map[nx][ny]-'A';
if(pipe[aa][i]&&pipe[bb][(i+2)%4])
{
f1=find(num1), f2=find(num2);
fa[f1]=f2;
}
}
}
int main()
{
int i, j, y;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n<0||m<0) break;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
scanf(" %c",&map[i][j]);
init();
for(i=0; i<n; i++)
for(j=0; j<m; j++)
solv(i,j);
int ans=0;
memset(vis,0,sizeof(vis));
for(i=0; i<n*m; i++)
{
y=find(i);
if(!vis[y])
ans++;
vis[y]=true;
}
printf("%d\n",ans);
}
return 0;
}
浙公网安备 33010602011771号