转载请注明出处:

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

----------------------------------------------------------------------------------------------------------------------------------------------------------

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

题意:有如上图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 || 并查集)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. hdu 1198 Farm Irrigation

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

  7. hdu 1198 Farm Irrigation(并查集)

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

  8. HDU 1198 Farm Irrigation (并查集优化,构图)

    本题和HDU畅通project类似.仅仅只是畅通project给出了数的连通关系, 而此题须要自己推断连通关系,即两个水管能否够连接到一起,也是本题的难点所在. 记录状态.不断combine(),注意 ...

  9. HDU 2553 N皇后问题(深搜DFS)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. 【剑指offer】面试题30:最小的K个数

    import random def partition(data, start, end): if end <= start: return start index = random.randi ...

  2. spring mvc相关问题

    1: 基于注解的SpringMVC简单介绍 2: spring组件扫描<context:component-scan/>使用详解 3: springMvc 注解配置例子

  3. TP5.0生成模块(home/admin)命令

    TP5.0> 进入项目根目录(tp5/),执行以下命令: > php think make:controller 模块名/控制器名 //语法 > php think make:con ...

  4. SyntaxError: Non-ASCII character '\xe5' in file index.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    python入门,hhh 在慕课网上学习python入门,编写汉诺塔的递归调用时,代码正确.但是加上注释后编译不通过 报如下错误: SyntaxError: Non-ASCII character , ...

  5. Mqtt ----心跳机制

    心跳机制 Keep Alive指定连接最大空闲时间T,当客户端检测到连接空闲时间超过T时,必须向Broker发送心跳报文PINGREQ,Broker收到心跳请求后返回心跳响应PINGRESP.若Bro ...

  6. dll中使用exe中的变量

    注意:输出目录为:Result共享目录 1.exe项目: // EXE.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" extern" ...

  7. TCP/IP 端口大全

    1 tcpmux TCP 端口服务多路复用 5 rje 远程作业入口 7 echo Echo 服务 9 discard 用于连接测试的空服务 11 systat 用于列举连接了的端口的系统状态 13 ...

  8. python None 和 NaN

    python原生的None和pandas, numpy中的numpy.NaN尽管在功能上都是用来标示空缺数据.但它们的行为在很多场景下确有一些相当大的差异.由于不熟悉这些差异,曾经给我的工作带来过不少 ...

  9. 基于注解配置spring

    1 对 bean 的标注基于注解方式有3个注解 @Component @Repository 对DAO类进行标注 @Service 对Service类进行标注 @Controller  对Contro ...

  10. ubuntu环境下配置jdk

    方法1:修改/etc/profile 文件 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 所有用户 ...