题意:

Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pipes, which is marked from A to K, as Figure 1 shows.

Benny has a map of his farm, which is an array of marks denoting the distribution of water pipes over the whole farm. For example, if he has a map 

ADC
FJK
IHE

then the water pipes are distributed like

Several wellsprings are found in the center of some squares, so water can flow along the pipes from one square to another. If water flow crosses one square, the whole farm land in this square is irrigated and will have a good harvest in autumn. 
Now Benny wants to know at least how many wellsprings should be found to have the whole farm land irrigated. Can you help him?

There are several test cases! In each test case, the first line contains 2 integers M and N, then M lines follow. In each of these lines, there are N characters, in the range of 'A' to 'K', denoting the type of water pipe over the corresponding square. A negative M or N denotes the end of input, else you can assume 1 <= M, N <= 50.

思路:

并查集,看代码。

代码:

struct node{
bool up,down,left,right;
}
a[2505]; int m,n;
char graph[55][55];
int fa[2505]; int findFa(int x){
return fa[x]==x?fa[x]:fa[x]=findFa(fa[x]);
} void Union(int x,int y){
int fx=findFa(x);
int fy=findFa(y);
if(fx!=fy){
fa[fx]=fy;
}
} int main(){ while(scanf("%d%d",&m,&n),m>0||n>0){
rep(i,0,m-1) scanf("%s",graph[i]); rep(i,1,m*n) a[i].up=a[i].down=a[i].left=a[i].right=false; rep(i,0,m-1){
rep(j,0,n-1){
switch(graph[i][j]){
case 'A':a[i*n+j+1].up=true; a[i*n+j+1].left=true; break;
case 'B':a[i*n+j+1].up=true; a[i*n+j+1].right=true; break;
case 'C':a[i*n+j+1].left=true; a[i*n+j+1].down=true; break;
case 'D':a[i*n+j+1].right=true; a[i*n+j+1].down=true; break;
case 'E':a[i*n+j+1].up=true; a[i*n+j+1].down=true; break;
case 'F':a[i*n+j+1].left=true; a[i*n+j+1].right=true; break;
case 'G':a[i*n+j+1].left=true; a[i*n+j+1].right=true; a[i*n+j+1].up=true; break;
case 'H':a[i*n+j+1].up=true; a[i*n+j+1].down=true; a[i*n+j+1].left=true; break;
case 'I':a[i*n+j+1].right=true; a[i*n+j+1].left=true; a[i*n+j+1].down=true; break;
case 'J':a[i*n+j+1].up=true; a[i*n+j+1].down=true; a[i*n+j+1].right=true; break;
case 'K':a[i*n+j+1].up=true; a[i*n+j+1].left=true; a[i*n+j+1].down=true; a[i*n+j+1].right=true; break;
default: break;
}
}
} rep(i,1,m*n) fa[i]=i;
rep(i,1,m){
rep(j,1,n){
int now=(i-1)*n+j;
if(j!=1){
int last1=(i-1)*n+j-1;
if(a[last1].right && a[now].left){
Union(last1,now);
}
}
if(i!=1){
int last2=(i-2)*n+j;
if(a[last2].down && a[now].up){
Union(last2,now);
}
}
}
} map<int,int> mp;
mp.clear();
int ans=0;
rep(i,1,m*n){
int t=findFa(i);
if(mp[t]==0){
++ans;
mp[t]=1;
}
} printf("%d\n",ans); } return 0;
}

hdu 1198 Farm Irrigation(并查集)的更多相关文章

  1. 杭电OJ——1198 Farm Irrigation (并查集)

    畅通工程 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可 ...

  2. hdu 1198 Farm Irrigation(深搜dfs || 并查集)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...

  3. HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. HDU 1198 Farm Irrigation(并查集+位运算)

    Farm Irrigation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tot ...

  5. HDU 1198 Farm Irrigation(状态压缩+DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目: Farm Irrigation Time Limit: 2000/1000 MS (Ja ...

  6. HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. hdu1198 Farm Irrigation 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 简单并查集 分别合并竖直方向和水平方向即可 代码: #include<iostream&g ...

  8. hdu.1198.Farm Irrigation(dfs +放大建图)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. hdu 1198 Farm Irrigation

    令人蛋疼的并查集…… 我居然做了大量的枚举,居然过了,我越来越佩服自己了 这个题有些像一个叫做“水管工”的游戏.给你一个m*n的图,每个单位可以有11种选择,然后相邻两个图只有都和对方连接,才判断他们 ...

随机推荐

  1. 安卓学习记录(四)——体温表APP

    1.新建project file->new->new project,选择Basic Activity 2.在content_main.xml中添加一个List View 1 <Li ...

  2. 如何画UML,几种简单的模型分析

    如何画UML 前言 UML 类 类的关系 1.依赖关系 2.继承关系 3.实现关系 4.关联关系 5.聚合关系 6.组合关系 总结 参考 如何画UML 前言 最近在学习设计模式,其中不免涉及到 UML ...

  3. PHP中的IMAP扩展简单入门

    对于邮件处理来说,大家比较熟悉的应该是 POP3 . SMTP 这类的协议,而今天我们介绍的 IMAP 其实也是非常常用的一种邮件处理协议.它和 POP3 比较类似,都是以接收处理邮件为主.不过相对于 ...

  4. PHP设计模式之状态模式

    状态模式从字面上其实并不是很好理解.这里的状态是什么意思呢?保存状态?那不就是备忘录模式了.其实,这里的状态是类的状态,通过改变类的某个状态,让这个类感觉像是换了一个类一样.说起来有点拗口吧,先学习概 ...

  5. java中的swing设计界面时怎么加上背景图片。而不覆盖其他控件?

    通过以下方式设置下背景就可以了: import java.awt.Container; import javax.swing.ImageIcon; import javax.swing.JFrame; ...

  6. 关于jQ的小案例分享

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>表 ...

  7. django ORM教程(转载)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  8. jmeter简单的压测案例——访问百度并发5,持续请求15

    好记性不如烂笔头,还是记记吧. jmeter压测的指标有很多,先从简单的入手,下一章节再讲解jmeter组件的作用. 需求是:访问百度的压测指标是:10s内并发5,持续15次请求.那么需要设置以下几点 ...

  9. 主动开启进程与join方法

    使用multiprocessing.Process来开启进程 import os import time from multiprocessing import Process def eat(): ...

  10. 「含源码」关于NXP IMX8 Mini的图形开发指南(GPU)案例分享!

    前言 Graphical Demo框架提供了对平台相关依赖的抽象.Graphical应用的通用封装,如模型加载.纹理加载.着色器编译等,以及其它一些通用的应用逻辑处理的封装,使得使用框架的开发人员(以 ...