Farm Irrigation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11188    Accepted Submission(s): 4876

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.

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

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

分析:

1.dfs

对每个方块的四个方向搜索

搜过的标记一下

注意能往四个方向搜索的条件:方块的边界

#include<bits/stdc++.h>
using namespace std;
#define max_v 51
int t[11][4]= {1,1,0,0,
0,1,1,0,
1,0,0,1,
0,0,1,1,
0,1,0,1,
1,0,1,0,
1,1,1,0,
1,1,0,1,
1,0,1,1,
0,1,1,1,
1,1,1,1,
};
int vis[max_v][max_v];
int f[max_v][max_v];
int n,m;
void dfs(int i,int j)
{
vis[i][j]=1;
if(j>0&&t[f[i][j-1]][2]&&t[f[i][j]][0]&&vis[i][j-1]==0)//左
dfs(i,j-1);
if(i>0&&t[f[i][j]][1]&&t[f[i-1][j]][3]&&vis[i-1][j]==0)//上
dfs(i-1,j);
if(i<m-1&&t[f[i][j]][3]&&t[f[i+1][j]][1]&&vis[i+1][j]==0)//下
dfs(i+1,j);
if(j<n-1&&t[f[i][j]][2]&&t[f[i][j+1]][0]&&vis[i][j+1]==0)//右
dfs(i,j+1); }
int main()
{
char c;
while(~scanf("%d %d",&m,&n))
{
getchar();
if(n==-1&&m==-1)
break;
// memset(f,0,sizeof(f));
int sum=0;
memset(vis,0,sizeof(vis));
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
scanf("%c",&c);
f[i][j]=c-'A';//转换
}
getchar();
}
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
if(vis[i][j]==0)
{
sum++;
dfs(i,j);
}
}
}
printf("%d\n",sum);
}
return 0;
}

2.并查集

问你连通图的个数,并查集,但是要自己构造连通条件

连通条件:

对每个方块,看它的左边和上面的方块能否和它连通,能的话就合并

注意方块的边界,比如第0行,就只要看他左边的方块能不能和他合并,不用看上面,因为上面是空的

第0行第0列的方块 跳过

第0行的 只看他左边的

第0列的 只看他上面的

其他的 看左边和上面的

11个方块,一个方块的四条边有管子的就是1,比如A块,1,1,0,0

#include<bits/stdc++.h>
using namespace std;
#define max_v 51
int t[11][4]={1,1,0,0,
0,1,1,0,
1,0,0,1,
0,0,1,1,
0,1,0,1,
1,0,1,0,
1,1,1,0,
1,1,0,1,
1,0,1,1,
0,1,1,1,
1,1,1,1,
};
int sum;
int pa[max_v*max_v];//数组大小需要注意,坑了很多次
int rk[max_v*max_v];
void make_set(int x)
{
pa[x]=x;
rk[x]=0;
}
int find_set(int x)
{
if(x!=pa[x])
pa[x]=find_set(pa[x]);
return pa[x];
}
void union_set(int x,int y)
{
x=find_set(x);
y=find_set(y);
if(x==y)
return ;
sum--;
if(rk[x]>rk[y])
{
pa[y]=x;
}else
{
pa[x]=y;
if(rk[x]==rk[y])
rk[y]++;
}
}
int main()
{
int n,m;
int f[max_v][max_v];
char c;
while(~scanf("%d %d",&m,&n))
{
getchar();
if(n==-1&&m==-1)
break;
// memset(f,0,sizeof(f));
sum=n*m;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%c",&c);
f[i][j]=c-'A';//转换
make_set(i*n+j);//初始化
if(i==0&&j==0)
continue;
else if(i==0)
{
if(t[f[i][j-1]][2]&&t[f[i][j]][0])//第0行,判断左
union_set(i*n+j,i*n+j-1);
}
else if(j==0)//第0列,判断上
{
if(t[f[i][j]][1]&&t[f[i-1][j]][3])
union_set(i*n+j,(i-1)*n+j);
}else
{
// 其他 判断左和上
if(t[f[i][j-1]][2]&&t[f[i][j]][0])
union_set(i*n+j,i*n+j-1);
if(t[f[i][j]][1]&&t[f[i-1][j]][3])
union_set(i*n+j,(i-1)*n+j);
}
}
getchar();
}
printf("%d\n",sum);
}
return 0;
}

HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)的更多相关文章

  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(并查集)

    题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...

  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. java设计模式-----8、策略模式

    Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略).S ...

  2. springboot开篇 (一)简单邮件发送

    上篇终结篇为spring 发送邮件,这次将使用springboot 发送邮件,同时本篇将作为springboot入门篇. 新建一个工程..工程目录结构如下,此次使用idea进行开发.对于一个长期使用e ...

  3. python_tensorflow_Django实现逻辑回归

    1.工程概要 2.data文件以及input_data文件准备 链接:https://pan.baidu.com/s/1EBNyNurBXWeJVyhNeVnmnA 提取码:4nnl 3.logiss ...

  4. bootstrap学习笔记细化(按钮)

    button:btn 圆角灰色按钮 button:btn btn-default 圆角灰色边框按钮 button:btn btn-success 绿色 button:btn btn-primary 蓝 ...

  5. react与vue

    vue的选择居于react与angular之间,框架自身的语法比react多一点,但是又比angular少一点. 也正是由于选择的不同,所呈现出来的写法与思考方式就一定会有所差异,不论优劣,但肯定会导 ...

  6. gulp & webpack整合

    为什么需要前端工程化? 前端工程化的意义在于让前端这个行业由野蛮时代进化为正规军时代,近年来很多相关的工具和概念诞生.好奇心日报在进行前端工程化的过程中,主要的挑战在于解决如下问题:✦ 如何管理多个项 ...

  7. 关于修改bug的思考

     作者:朱金灿 来源:http://blog.csdn.net/clever101 有软件就有bug,这意味着软件研发不仅仅是新功能开发,更要拿出相当一部分精力去修改bug.但基本很多软件开发者并 ...

  8. Google APAC----Africa 2010, Qualification Round(Problem B. Reverse Words)----Perl 解法

    原题地址链接:https://code.google.com/codejam/contest/351101/dashboard#s=p1 问题描述: Problem Given a list of s ...

  9. OpenCV实现基于傅里叶变换的旋转文本校正

    代码 先给出代码,再详细解释一下过程: #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp& ...

  10. HBase性能优化方法总结

    1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数 ...