HDU 1198--并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1198

并查集,把每个方块编号,然后有联通的将其并起来,方向的控制及编号的处理比较复杂。

代码:

复制代码
View Code
 1 #include<iostream>
 2 using namespace std;
 3 int farm[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},
 4 {0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};//将A~H的水管方向按照上、右、下、左标记
 5 int dist[4][2]={{-1,0},{0,1},{1,0},{0,-1}},p[3000],vis[3000];
 6 char g[55][55];
 7 int findx(int x)
 8 {
 9     if(x!=p[x])
10         p[x]=p[findx(p[x])];
11     return p[x];
12 }
13 void merge(int x,int y)
14 {
15     p[findx(x)]=findx(y);
16 }
17 int main()
18 {
19     int n,m,i,j,k;
20     while(~scanf("%d %d ",&n,&m),n!=-1||m!=-1)
21     {
22         for(i=0;i<=n*m;i++)
23                 p[i]=i,vis[i]=0;
24         for(i=1;i<=n;i++)
25             for(j=1;j<=m;j++)
26                 scanf(" %c ",&g[i][j]);
27         for(i=1;i<=n;i++)
28             for(j=1;j<=m;j++)
29             {
30                 if(!vis[(i-1)*m+j])
31                 {
32                     for(k=0;k<4;k++)
33                     {
34                         int dx=i+dist[k][0];
35                         int dy=j+dist[k][1];
36                         if(dx<1||dy<1||dx>n||dy>m)
37                             continue;
38                         int fx;
39                         if(k%2==0)
40                             fx=(k==0?2:0);
41                         else
42                             fx=(k==1?3:1);           //控制方向
43                         if(farm[g[dx][dy]-'A'][fx]&&farm[g[i][j]-'A'][k]&&!vis[(dx-1)*m+dy])
44                         {
45                             merge((i-1)*m+j,(dx-1)*m+dy);
46                             vis[(i-1)*m+j]=1;
47                         }
48                     }
49                 }
50             }
51             int cnt=0;
52             for(i=1;i<=n*m;i++)
53                 if(p[i]==i)
54                     ++cnt;
55             printf("%d\n",cnt);
56     }
57     return 0;
58 }
复制代码

 

posted on 2013-03-04 14:58  acoderworld  阅读(56)  评论(0)    收藏  举报

编辑推荐:
· 从 Redis 客户端超时到 .NET 线程池挑战
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
· 独立开发,这条路可行吗?
· 我在厂里搞 wine 的日子
阅读排行:
· 他没买 iPad,而是花了半年时间,为所有“穷学生”写了个笔记神器
· Visual Studio 现已支持新的、更简洁的解决方案文件(slnx)格式
· 只需一行命令,Win11秒变Linux开发主机!
· 也是出息了,业务代码里面也用上算法了。
· 2025年中总结:我想我克服公众演讲的恐惧了,一个社恐分子突破自我的故事
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

导航

统计

点击右上角即可分享
微信分享提示