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的连通块问题 两个相邻农田的管道能够直接连接的 ...
随机推荐
- sql执行效率 Explain
explain+sql语句 explain返回的结果项很多,这里我们只关注三种,分别是type,key,rows. key:显示MySQL实际决定使用的键(索引).如果没有选择索引,键是NULL. r ...
- (转)对称加密与非对称加密,以及RSA的原理
一 概述 二对称加密和非对称加密 对称加密 非对称加密 区别 三RSA原理 整数运算 同余运算 当模数为合数n时 当模数为质数p的时候 离散对数问题 RSA原理 一 , 概述 在现代密码学诞生以前,就 ...
- Log4j官方文档翻译(九、输出到数据库)
log4j提供了org.apache.log4j.JDBCAppender对象,可以把日志输出到特定的数据库. 常用的属性: bufferSize 设置buffer的大小,默认是1 driver 设置 ...
- arcgis engine10.1和arcObjects的一些问题
1.arcengine10.1只支持vs2010 2.10.1以后没有engine runtimes,改成engine了,以前的engine可以理解为Arcobject,就是我们可以只装AO
- [usaco dec 15] 卡牌游戏 cardgame [贪心]
题面: 传送门 思路: 这道题官方标准解法是线段树维护一堆奇奇怪怪的东西......我用的是贪心 方法很简单,处理出pre和suf数组,分别代表前i张.后i张牌在最优方案下打出时可以得到的分数,然后两 ...
- react history模式下的白屏问题
近期,再用react的时候,由于不想用丑陋的hash,便将路由模式切换成history了,结果带来了一些问题,比如刷新白屏,还有图片加载不出来,这里我们说一下解决方案. 原因 首先,我们说一下造成这一 ...
- vue经验总结
1. vue中获取dom节点时机 vue组件中获取dom节点一定要在mounted周期之后的下一次事件循环,包括 component.$refs,component.$el,component.$ch ...
- 3973: seq
3973: seq 题目描述 小y 的男朋友送给小y 一个数列{ai}{ai},并且刁难小y 要她维护这个序列. 具体而言,小y 的男朋友要求小y 完成两个操作: 1. 修改数列中的一个数 2. 设p ...
- 【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)
前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不 ...
- ubuntu 配置虚拟主机
ubuntu下Apache虚拟主机的配置 启用站点停用站点方法 a2ensite/a2dissite 比如添加一个ecshop 的虚拟机 首先到/etc/apache2/site-availa ...