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 ...
随机推荐
- 【LeetCode】96. Unique Binary Search Trees (2 solutions)
Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) that st ...
- UE初写小项目问题之命令行报错:Expected indentation of 4 spaces but found 6
一.问题 刚开始用一个小项目练手,用vue-cli初始化项目,直接安装了所有的东西,如vue-router.ESLint.unit tests等等,当时只懂得vue-router是什么. 问题来了,在 ...
- laravel的cookie操作
前提你的整个http流程一定要走完,页就是必须走到view()或Response,你写到中间中断调试,cookie是设置不上去的......(坑~~) 读取: $value = Cookie::get ...
- 深入浅出Spring(一)Spring概述
现在很多的企业级项目中基本上都会用到了Spring框架,那么为什么会出现Spring,Spring是什么?这次的博文我主要为大家简单介绍一下Spring. Java EE优缺点 我们都知道在2003年 ...
- Oracle 11g安装图文攻略
一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: http://www.ora ...
- Oracle:shared memory realm does not exist
1. 先描述一个连接Oracle 10g的错误:“shared memory realm does not exist” 如图所示Sqlplus连接时出现这个错误: 2. Oracle 服务器主要组件 ...
- FreeRTOS 调度锁,任务锁和中断锁
以下转载自安富莱电子: http://forum.armfly.com/forum.php 调度锁调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调度锁关之 ...
- Vanya and Brackets
Vanya and Brackets Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u ...
- 基于HTML5 Canvas 实现的 Loading 效果
Sonic.js 是一个很小的 JavaScript 类,用于创建基于 HTML5 画布的加载图像.更强大的是 Sonic.js 还提供了基于现成的例子的创建工具,可以帮助你实现更多自定义的(Load ...
- love2d教程31--Tiled地图存档和动态修改
Advanced-Tiled-Loader有点问题,我给作者发信,可惜作者没回. 好吧,毛主席教导我们“自己动手,丰衣足食”,只好自己修改了. 1.想把0.8里的函数改为0.9的 2.添加获取对象层里 ...