hdu 1198 Farm Irrigation(深搜dfs || 并查集)
转载请注明出处: viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198
----------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋:http://user.qzone.qq.com/593830943/main
----------------------------------------------------------------------------------------------------------------------------------------------------------
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.
corresponding square. A negative M or N denotes the end of input, else you can assume 1 <= M, N <= 50.
2 2
DK
HF 3 3
ADC
FJK
IHE -1 -1
2
3
题意:有如上图11种土地块,块中的绿色线条为土地块中修好的水渠,如今一片土地由上述的各种土地块组成。须要浇水,问须要打多少口井。
代码一(dfs):
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define TM 117
//存储11中类型的土地。二维中的0 1 2 3分别代表这样的类型的土地的左上右下
//为1表示这个方向有接口,为0表示这个方向没有接口
int a[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1},
{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};
int map[TM][TM];
char s[TM][TM];
bool vis[TM][TM];
int n, m, coun;
void dfs(int x, int y)
{
vis[x][y] = true;
for(int i = 0; i < 4; i++)
{
if(i == 0)//向上查找
{
if(a[map[x][y]][0]&&a[map[x-1][y]][2]&&x-1>=0&&!vis[x-1][y])
dfs(x-1,y);
}
else if(i == 1)//向右查找
{
if(a[map[x][y]][1]&&a[map[x][y+1]][3]&&y+1<m&&!vis[x][y+1])
dfs(x,y+1);
}
else if(i == 2)//向下查找
{
if(a[map[x][y]][2]&&a[map[x+1][y]][0]&&x+1<n&&!vis[x+1][y])
dfs(x+1,y);
}
else if(i == 3)//向左查找
{
if(a[map[x][y]][3]&&a[map[x][y-1]][1]&&y-1>=0&&!vis[x][y-1])
dfs(x,y-1);
}
}
return;
}
void init()//初始化
{
memset(vis,false,sizeof(vis));
coun = 0;
}
int main()
{
int i, j;
while(cin>>n>>m)
{
init();
if(n==-1 && m==-1)
break;
for(i = 0; i < n; i++)
{
cin>>s[i];
for(j = 0; j < m; j++)
{
map[i][j] = s[i][j]-'A';
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
if(!vis[i][j])
{
coun++;
dfs(i,j);
}
}
}
cout<<coun<<endl;
}
return 0;
}
代码二:(并查集)
#include <iostream>
#include <algorithm>
using namespace std;
#define TM 117
//存储11中类型的土地。二维中的0 1 2 3分别代表这样的类型的土地的左上右下
//为1表示这个方向有接口。为0表示这个方向没有接口
int a[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1},
{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};
struct p
{
int f;//记录每块田地水管的分布
int c;//分别对每块田地编号
}map[TM][TM];
char s[TM][TM];
int father[TM*TM];
int n, m, coun, k;
int find(int x)
{
return x==father[x]?x:father[x]=find(father[x]);
} void init()//初始化
{
for(int i = 0; i <= n*m; i++)
{
father[i] = i;
}
coun = k = 0;
} void Union(int x, int y)
{
int f1 = find(x);
int f2 = find(y);
if(f1!=f2)
{
father[f2] = f1;
}
}
void F(int x, int y)
{
for(int i = 0; i < 4; i++)
{
if(i == 0)//向上查找
{
if(a[map[x][y].f][0]&&a[map[x-1][y].f][2]&&x-1>=0)
{
Union(map[x][y].c,map[x-1][y].c);
}
}
else if(i == 1)//向右查找
{
if(a[map[x][y].f][1]&&a[map[x][y+1].f][3]&&y+1<m)
{
Union(map[x][y].c,map[x][y+1].c);
}
}
else if(i == 2)//向下查找
{
if(a[map[x][y].f][2]&&a[map[x+1][y].f][0]&&x+1<n)
{
Union(map[x][y].c,map[x+1][y].c);
}
}
else if(i == 3)//向左查找
{
if(a[map[x][y].f][3]&&a[map[x][y-1].f][1]&&y-1>=0)
{
Union(map[x][y].c,map[x][y-1].c);
}
}
}
} int main()
{
int i, j;
while(cin>>n>>m)
{
init();
if(n==-1 && m==-1)
break;
for(i = 0; i < n; i++)
{
cin>>s[i];
for(j = 0; j < m; j++)
{
map[i][j].f = s[i][j]-'A';
map[i][j].c = k++;
}
}
for(i = 0; i < n; i++)//分别对每块田地查找是否和别的田地的水管联通
{
for(j = 0; j < m; j++)
{
F(i,j);
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)//查找有多少个独立的集合
{
if(father[map[i][j].c] == map[i][j].c)
coun++;
}
}
cout<<coun<<endl;
}
return 0;
}
hdu 1198 Farm Irrigation(深搜dfs || 并查集)的更多相关文章
- HDU 1198 Farm Irrigation(状态压缩+DFS)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目: Farm Irrigation Time Limit: 2000/1000 MS (Ja ...
- HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu.1198.Farm Irrigation(dfs +放大建图)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1198 Farm Irrigation(并查集+位运算)
Farm Irrigation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tot ...
- hdu 1198 Farm Irrigation
令人蛋疼的并查集…… 我居然做了大量的枚举,居然过了,我越来越佩服自己了 这个题有些像一个叫做“水管工”的游戏.给你一个m*n的图,每个单位可以有11种选择,然后相邻两个图只有都和对方连接,才判断他们 ...
- hdu 1198 Farm Irrigation(并查集)
题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...
- HDU 1198 Farm Irrigation (并查集优化,构图)
本题和HDU畅通project类似.仅仅只是畅通project给出了数的连通关系, 而此题须要自己推断连通关系,即两个水管能否够连接到一起,也是本题的难点所在. 记录状态.不断combine(),注意 ...
- HDU 2553 N皇后问题(深搜DFS)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- String的split()方法探索和大揭秘
事实上没打算写这么一篇博文的,可是昨天在逛论坛的时候,发现一帖子,然后我又把帖子的内容在群里发了一通,结果出现了让人吃惊的结果,所以这里简单的给大家分享一下split()方法,免得大伙儿以后还会出现这 ...
- Android开发之Shortcuts, LiveFolder, Widget
2013-07-05 桌面组件包括:快捷方式(Shortcuts),实时文件夹(Live Folder),桌面插件(Widget). 快捷方式用于启动应用程序的某个组件,例如Activity, S ...
- C# 判断是否是节假日
1.引用Newtonsoft.Json.dll 2. /// <summary> /// 判断是不是节假日,节假日返回true /// </summar ...
- WebService一些概念
1.WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 2.我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我 ...
- mysql和redis之间互相备份
http://code.google.com/p/redisql/wiki/Examples 项目地址:https://github.com/JakSprats/predis/blob/master/ ...
- Android开发优化之——从代码角度进行优化
通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻 辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点, ...
- Effective Java 读书小结 2
1 接口通常是定义允许多个实现的类型的最好实践.例外情况是演变的容易性比灵活性和功能更为重要,这种情况下使用抽象类来定义类型比较好.如果提供了一个比较重要的接口,最好同时提供骨架实现类. 骨架实现类: ...
- CodeMirror与jquery UI-Tabs混合使用 注意事项
第一步:.将代码高亮渲染 第二步:jquery Tab输出: 第三步:点击Tab切换时,将代码块刷新: 参考:http://jtmorris.net/2013/06/codemirror-editor ...
- [k8s]helm原理&私有库搭建&monocularui和kubeapp探究
运行最简单的charts示例 helm的2个chart例子: https://github.com/kubernetes/helm/tree/master/docs/examples/nginx he ...
- linux下实现CPU使用率和内存使用率获取方法
想获取一下目标机运行时linux系统的硬件占用情况,写了这几个小程序,以后直接用了. 方法就是读取proc下的文件来获取了. cpu使用率: /proc/stat ,内存使用情况: /p ...