HDU 1198--并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1198
并查集,把每个方块编号,然后有联通的将其并起来,方向的控制及编号的处理比较复杂。
代码:

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) 收藏 举报
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 Redis 客户端超时到 .NET 线程池挑战
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
· 独立开发,这条路可行吗?
· 我在厂里搞 wine 的日子
· 他没买 iPad,而是花了半年时间,为所有“穷学生”写了个笔记神器
· Visual Studio 现已支持新的、更简洁的解决方案文件(slnx)格式
· 只需一行命令,Win11秒变Linux开发主机!
· 也是出息了,业务代码里面也用上算法了。
· 2025年中总结:我想我克服公众演讲的恐惧了,一个社恐分子突破自我的故事