HDU_1198_FarmIrrigation
2015-08-11 16:02
197 查看
Farm Irrigation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7285 Accepted Submission(s): 3123
Problem Description
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.
![](http://acm.hdu.edu.cn/data/images/1121-1.gif)
Figure 1
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
![](http://acm.hdu.edu.cn/data/images/1121-2.gif)
Figure 2
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?
Note: In the above example, at least 3 wellsprings are needed, as those red points in Figure 2 show.
Input
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.
Output
For each test case, output in one line the least number of wellsprings needed.
Sample Input
2 2 DK HF 3 3 ADC FJK IHE -1 -1
Sample Output
2 3
Author
ZHENG, Lu
Source
Zhejiang University Local Contest 2005
Recommend
Ignatius.L
典型的并查集问题
用数组来把各个块上下左右有没有连通标记一下
然后横着扫一遍连通竖着扫一遍连通就可以了
当然这个题目用dfs做应该也是可以的 以后复习dfs补充dfs代码
#include <iostream> #include <stdio.h> #include <string> using namespace std; const int M=55; char ti[M][M]; int uf[M*M]; int isc[M*M]; int shang[]={1,1,0,0,1,0,1,1,0,1,1}; int xia[]={0,0,1,1,1,0,0,1,1,1,1}; int zuo[]={1,0,1,0,0,1,1,1,1,0,1}; int you[]={0,1,0,1,0,1,1,0,1,1,1}; int find(int i) { if(i==uf[i]) return i; return uf[i]=find(uf[i]); } void merge(int i,int j) { int t1=find(i); int t2=find(j); if(t1==t2) return; uf[t2]=t1; } int main() { int n,m; while(1) { scanf("%d%d",&n,&m); if(n<0&&m<0) break; for(int i=1;i<=n*m;i++) { uf[i]=i; isc[i]=0; } for(int i=1;i<=n;i++) scanf("%s",ti[i]+1); for(int i=1;i<=n;i++) { for(int j=1;j<m;j++) { if(you[ti[i][j]-'A']&&zuo[ti[i][j+1]-'A']) merge((i-1)*m+j,(i-1)*m+j+1); } } for(int i=1;i<=m;i++) { for(int j=1;j<n;j++) { if(xia[ti[j][i]-'A']&&shang[ti[j+1][i]-'A']) merge((j-1)*m+i,j*m+i); } } int co=0; for(int i=1;i<=n*m;i++) //数连通块的个数 { //其实不用这样 if(!isc[find(i)]) //直接判断是不是并查集的根节点就可以了 { co++; isc[find(i)]=1; } } printf("%d\n",co); } return 0; }
相关文章推荐
- Java基础(五)Java中的参数传递机制
- Devexpress Ribbon
- 【转载】Python Version 2.7 required which was not found in the registry 问题解决
- JavaScript的对象
- 下一代RDS技术预览版RemoteFX实测体验
- 下一代RDS技术预览版RemoteFX实测体验
- Android 6.0 Phone MO(去电)流程分析(应用层)
- 算法 topN
- js判断子窗体是否关闭的方法
- 使用unlist将日期型数据的列表转换为向量时,出现的异常
- linux基础教程-----目录文件操作(1)
- Phpcmsv9升级后验证码不显示的解决一 例
- C++类实现hash表的抽象数据结构(链式解决冲突)
- android scrollview listview 滚动冲突解决方案
- Map四种获取key和value值的方法,以及对map中的元素排序
- 169 Majority Element
- DWR:返回值为空?
- Python 中的隐藏特性
- java 反射
- java基础--IO