hdu1198Farm Irrigation(dfs找联通)
题目链接:
思路是:首先依据图像抽象出联通关系。。
首先确定每一种图形的联通关系。用01值表示不连通与不连通。。。
然后从第1个图形进行dfs搜索。假设碰到两快田地能够联通的话那么标记。。注意处理的过程中你的
搜索顺序要和你的每一个图形的连通性的顺序同样。
。然后就是最后看上下。
左右是否能匹配。。
。
看最后有几个不同的快,这就是答案,感觉跟并查集一样。。并查集应该也能够做。
。
题目:
Farm Irrigation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5696 Accepted Submission(s): 2474
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.
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
pid=1856" target="_blank" style="color:rgb(26,92,200); text-decoration:none">1856
1811 1829#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,ans;
const int maxn=50+10;
int map[maxn][maxn];
int dX[]={-1,0,1,0};
int dY[]={0,1,0,-1};
int pipe[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 hash[maxn][maxn];
bool check(int row,int col)
{
if(row>=0&&row<n&&col>=0&&col<m&&!hash[row][col])
return true;
return false;
}
void dfs(int row,int col)
{
hash[row][col]=1;
for(int k=0;k<4;k++)
{
int dx=row+dX[k];
int dy=col+dY[k];
if(check(dx,dy)&&pipe[map[row][col]][k]==1&&pipe[map[dx][dy]][(k+2)%4]==1)
dfs(dx,dy);
}
}
void solve()
{
memset(hash,0,sizeof(hash));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(!hash[i][j])
{
dfs(i,j);
ans++;
}
}
}
int main()
{
char str[maxn];
while(~scanf("%d%d",&n,&m))
{
ans=0;
if(n<=0||m<=0) return 0;
for(int i=0;i<n;i++)
{
scanf("%s",str);
for(int j=0;j<m;j++)
map[i][j]=str[j]-'A';
}
solve();
printf("%d\n",ans);
}
return 0;
}
#include<cstring>
#include<iostream>
using namespace std; int n,m,ans;
const int maxn=50+10;
int map[maxn][maxn]; int dX[]={-1,0,1,0};
int dY[]={0,1,0,-1}; int pipe[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 hash[maxn][maxn]; bool check(int row,int col)
{
if(row>=0&&row<n&&col>=0&&col<m&&!hash[row][col])
return true;
return false;
} void dfs(int row,int col)
{
hash[row][col]=1;
for(int k=0;k<4;k++)
{
int dx=row+dX[k];
int dy=col+dY[k];
if(check(dx,dy)&&pipe[map[row][col]][k]==1&&pipe[map[dx][dy]][(k+2)%4]==1)
dfs(dx,dy);
}
} void solve()
{
memset(hash,0,sizeof(hash));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(!hash[i][j])
{
dfs(i,j);
ans++;
}
}
} int main()
{
char str[maxn];
while(~scanf("%d%d",&n,&m))
{
ans=0;
if(n<=0||m<=0) return 0;
for(int i=0;i<n;i++)
{
scanf("%s",str);
for(int j=0;j<m;j++)
map[i][j]=str[j]-'A';
}
solve();
printf("%d\n",ans);
}
return 0;
}
hdu1198Farm Irrigation(dfs找联通)的更多相关文章
- hdu1198Farm Irrigation (DFS)
Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is ...
- POJ 3620 Avoid The Lakes【DFS找联通块】
Avoid The Lakes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6826 Accepted: 3637 D ...
- 用dfs求联通块(UVa572)
一.题目 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符所在的格子相邻(横.竖.或者对角线方向),就说它们属于同一个八连块. 二.解题思路 和前面的二叉树遍历类似,图也有DF ...
- 用dfs遍历联通块(优化)
一.题目(CF 598D) 输入一个n x m的字符矩阵,求从某个空点出发,能碰到多少面墙壁,总共询问k次.(3 ≤m,n ≤1000,1 ≤ k ≤ min(nm,100 000)) 二.解题思路 ...
- 利用DFS求联通块个数
/*572 - Oil Deposits ---DFS求联通块个数:从每个@出发遍历它周围的@.每次访问一个格子就给它一个联通编号,在访问之前,先检查他是否 ---已有编号,从而避免了一个格子重复访问 ...
- CodeForces - 103B(思维+dfs找环)
题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作.美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼 ...
- # 「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程)
「银联初赛第一场」自学图论的码队弟弟(dfs找环+巧解n个二元一次方程) 题链 题意:n条边n个节点的连通图,边权为两个节点的权值之和,没有「自环」或「重边」,给出的图中有且只有一个包括奇数个结点的环 ...
- hdu.1198.Farm Irrigation(dfs +放大建图)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- ZOJ 2412 Farm Irrigation(DFS 条件通讯块)
意甲冠军 两个农田管内可直接连接到壳体 他们将能够共享一个水源 有11种农田 管道的位置高于一定 一个农田矩阵 问至少须要多少水源 DFS的连通块问题 两个相邻农田的管道能够直接连接的 ...
随机推荐
- BZOJ 1010: [HNOI2008]玩具装箱toy(DP+斜率优化)
[HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
- [UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机
[UOJ#132][BZOJ4200][luogu_P2304][NOI2015]小园丁与老司机 试题描述 小园丁 Mr. S 负责看管一片田野,田野可以看作一个二维平面.田野上有 \(n\) 棵许愿 ...
- java读取文件的基本操作
import java.io.FileInputStream; /** * 使用FileInputStream读取文件 */ public class FileRead { /** * @param ...
- UOJ Goodbye Bingshen
在叶子童鞋的推荐下打了这场比赛... 感觉被虐爆了... 怎么这么多构造题... 我还没写过呢... 交互题是毛线...看了好久没看懂...就放弃了...(我语文好差QAQ...) 最后只会T1... ...
- kernel thread vs user thread
The most important difference is they use different memory, the kernel mode thread can access any ke ...
- 洛谷P1965 转圈游戏 [NOIP2013]
题目描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此 ...
- set与map的区别
STL中:MAP的节点是一对数据. SET的节点是一个数据. Map使用关键值Key来唯一标识每一个成员 map可以重复.set是集合 都属于关联容器 只不过, map的形式 map& ...
- Docker(八):私有仓库
有时候使用Docker Hub这样的公共仓库可能不太方便,用户可以创建一个本地仓库供私人使用. 在安装了Docker之后,可以获取官方的registry镜像来运行,docker-registry是官方 ...
- requireJs杂项
如果设置了baseUrl,那么baseUrl目录下的模块可以被加载,那么被加载之后的模块Id是什么?文件名吗? 入口函数的写法?是不是要执行,后面加() 中文网中指的优化工具是什么? ...
- jQuery动态创建form表单并提交到后台(携带一定的数据进行页面跳转)
今天遇到这么一个需求,携带一个编号一个名字跳转到另一个JSP页面,直接页面跳转(get携带数据)的话不太安全,于是想到到后台转发一下. 第一种:直接以表单提交方式的进行 JS代码: var form ...