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