hdu 1189 Farm Irrigation(并查集)

来源:互联网 发布:知乎排名规则 编辑:程序博客网 时间:2024/06/06 12:25

题目分析:给n*m块正方形地,问需要几个灌溉系统,

1.给每一块地,从左到右,从上到下,编号为0,1,....n*m-1。对于每一块地(x,y),扫描四个位置,如果可以连接,就把他们放到一个集合里,最后扫描集合数,



。。。。。代码有错误,,,不知道wa在那里大哭

代码:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;char maze[55][55];int m,n;int set[10000];int find(int x){int i;for(i=x;i!=set[i];i=set[i]);while(x!=i){int temp=set[x];set[x]=i;x=temp;}return i;}bool up_match(int x,int y){if(maze[x][y]=='C'||maze[x][y]=='D'||maze[x][y]=='E'||maze[x][y]=='H'||maze[x][y]=='I'||maze[x][y]=='J'||maze[x][y]=='K')return true;elsereturn false;}bool down_match(int x,int y){if(maze[x][y]=='A'||maze[x][y]=='B'||maze[x][y]=='E'||maze[x][y]=='G'||maze[x][y]=='H'||maze[x][y]=='J'||maze[x][y]=='K')return true;elsereturn false;}bool left_match(int x,int y){if(maze[x][y]=='B'||maze[x][y]=='D'||maze[x][y]=='F'||maze[x][y]=='G'||maze[x][y]=='I'||maze[x][y]=='J'||maze[x][y]=='K')return true;elsereturn false;}bool right_match(int x,int y){if(maze[x][y]=='A'||maze[x][y]=='C'||maze[x][y]=='F'||maze[x][y]=='G'||maze[x][y]=='H'||maze[x][y]=='I'||maze[x][y]=='K')return true;elsereturn false;}void function(int x,int y){if(maze[x][y]=='A'){if(x-1>=0){if(up_match(x-1,y)){int fx=find(x*m+y);int fy=find((x-1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y-1>=0){if(left_match(x,y-1)){int fx=find(x*m+y);int fy=find(x*m+y-1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='B'){if(x-1>=0){if(up_match(x-1,y)){int fx=find(x*m+y);int fy=find((x-1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y+1<n){if(right_match(x,y+1)){int fx=find(x*m+y);int fy=find(x*m+y+1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='C'){if(x+1<m){if(down_match(x+1,y)){int fx=find(x*m+y);int fy=find((x+1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y-1>=0){if(left_match(x,y-1)){int fx=find(x*m+y);int fy=find(x*m+y-1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='D'){if(x+1<m){if(down_match(x+1,y)){int fx=find(x*m+y);int fy=find((x+1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y+1<n){if(right_match(x,y+1)){int fx=find(x*m+y);int fy=find(x*m+y+1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='E'){if(x-1>=0){if(up_match(x-1,y)){int fx=find(x*m+y);int fy=find((x-1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(x+1<m){if(down_match(x+1,y)){int fx=find(x*m+y);int fy=find((x+1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='F'){if(y-1>=0){if(left_match(x,y-1)){int fx=find(x*m+y);int fy=find(x*m+y-1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y+1<n){if(right_match(x,y+1)){int fx=find(x*m+y);int fy=find(x*m+y+1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='G'){if(x-1>=0){if(up_match(x-1,y)){int fx=find(x*m+y);int fy=find((x-1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y-1>=0){if(left_match(x,y-1)){int fx=find(x*m+y);int fy=find(x*m+y-1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y+1<n){if(right_match(x,y+1)){int fx=find(x*m+y);int fy=find(x*m+y+1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='H'){if(x-1>=0){if(up_match(x-1,y)){int fx=find(x*m+y);int fy=find((x-1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(x+1<m){if(down_match(x+1,y)){int fx=find(x*m+y);int fy=find((x+1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y-1>=0){if(left_match(x,y-1)){int fx=find(x*m+y);int fy=find(x*m+y-1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='I'){if(x+1<m){if(down_match(x+1,y)){int fx=find(x*m+y);int fy=find((x+1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y-1>=0){if(left_match(x,y-1)){int fx=find(x*m+y);int fy=find(x*m+y-1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y+1<n){if(right_match(x,y+1)){int fx=find(x*m+y);int fy=find(x*m+y+1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='J'){if(x-1>=0){if(up_match(x-1,y)){int fx=find(x*m+y);int fy=find((x-1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(x+1<m){if(down_match(x+1,y)){int fx=find(x*m+y);int fy=find((x+1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y+1<n){if(right_match(x,y+1)){int fx=find(x*m+y);int fy=find(x*m+y+1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}if(maze[x][y]=='k'){if(x-1>=0){if(up_match(x-1,y)){int fx=find(x*m+y);int fy=find((x-1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(x+1<m){if(down_match(x+1,y)){int fx=find(x*m+y);int fy=find((x+1)*m+y);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y-1>=0){if(left_match(x,y-1)){int fx=find(x*m+y);int fy=find(x*m+y-1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}if(y+1<n){if(right_match(x,y+1)){int fx=find(x*m+y);int fy=find(x*m+y+1);if(fx<fy){set[fy]=fx;}else{set[fx]=fy;}}}}}int main(){while(scanf("%d %d",&m,&n)!=EOF){if(m==-1 && n==-1)break;for(int i=0;i<m;i++)//不是n,,,m,n搞反了scanf("%s",maze[i]);for(int i=0;i<10000;i++)set[i]=i;for(int i=0;i<m;i++)for(int j=0;j<n;j++)function(i,j);int ans=0;for(int i=0;i<m*n;i++)if(set[i]==i)ans++;printf("%d\n",ans);}//system("pause");return 0;}


原创粉丝点击