Lake Counting(POJ No.2386)
题目描述:有一个大小为N*M的园子,八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对w的*部分)
***
*w*
***
限制条件
N,M<=100
样例
输入:
N=10,M=12
园子如下图('w'表示积水,'.'表示没有积水)
w . . . . . . . . ww .
. www . . . . www
. . . . ww . . . ww .
. . . . . . . . . . ww .
. . . . . . . . . . w . .
. . w . . . . . . . w . .
. w . w . . . . . ww .
w . w . w . . . . . w .
. w . w . . . . . . w .
. . w . . . . . . . . w .
输出
3
分析: 从图上可以直观的看出有三个连通块。从任意的w开始,不停的把邻接的部分用’ . '代替。1次dfs后 与初始的这个w连接的所有w就都被替换成了' . ',因此直到图中不再存在w为止,总共进行dfs的次数就是答案了。
#include<iostream>
using namespace std; #define MAX_N 101 int N,M;
int x1,x2,y1,y2;
char field[MAX_N][MAX_N+]; void dfs(int x,int y)//x,y为现在位置
{
field[x][y]='.';//将现在位置替换为'.'
x1=x-; x2=x+;
y1=y-; y2=y+; //向八个方向搜索
if(x1>= && field[x1][y]=='w') dfs(x1,y);
if(x2<N && field[x2][y]=='w') dfs(x2,y);
if(y1>= && field[x][y1]=='w') dfs(x,y1);
if(y2<M && field[x][y2]=='w') dfs(x,y2);
if(x1>=&&y1>=&&field[x1][y1]=='w') dfs(x1,y1);
if(x1>=&&y2<M&&field[x1][y2]=='w') dfs(x1,y2);
if(x2<N&&y1>=&&field[x2][y1]=='w') dfs(x2,y1);
if(x2<N&&y2<M&&field[x2][y2]=='w') dfs(x2,y2); return;
} int main()
{
cin>>N>>M;
for(int i=; i<N; i++){
for(int j=; j<M; j++)
{
cin>>field[i][j];
}
}
int res=;
for(int i=; i<N; i++){
for(int j=; j<M; j++){
if(field[i][j]=='w'){
dfs(i,j);
res++;
}
}
}
cout<<res;
return ;
}
其中函数dfs还有另一种写法
void dfs(int x,int y){
//将现在所在位置替换为.
field[x][y]='.';
//循环遍历移动的8个方向
for(int dx=-1;dx<=1; dx++){
for(int dy=-1; dy<1; dy++){
int nx=x+dx,ny=y+dy;
if(0<=nx && nx<N && 0<=ny && ny<M && field[nx][ny]=='w')
{
dfs(nx,ny);
}
}
}
return ;
}
Lake Counting(POJ No.2386)的更多相关文章
- 深度搜索DFS-Lake Counting(POJ NO.2386)
题目链接POJ NO.2386 解题思路: 这个也是一个dfs 的应用,在书上的例子,因为书上的代码并不全,基本都是函数分块来写,通过这个题目也规范了代码,以后能用函数的就都用函数来实现吧.采用深度优 ...
- POJ 2386 Lake Counting(搜索联通块)
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 48370 Accepted: 23775 Descr ...
- DFS:Lake Counting(POJ 2386)
好吧前几天一直没更新博客,主要是更新博客的确是要耗费一点精力 北大教你数水坑 最近更新博客可能就是一点旧的东西和一些水题,主要是最近对汇编感兴趣了嘻嘻嘻 这一题挺简单的,没什么难度,简单深搜 #inc ...
- POJ 2386 Lake Counting (简单深搜)
Description Due to recent rains, water has pooled in various places in Farmer John's field, which is ...
- POJ:2386 Lake Counting(dfs)
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40370 Accepted: 20015 D ...
- POJ 2386 Lake Counting(深搜)
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17917 Accepted: 906 ...
- poj 2386:Lake Counting(简单DFS深搜)
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18201 Accepted: 9192 De ...
- 【POJ - 2386】Lake Counting (dfs+染色)
-->Lake Counting 直接上中文了 Descriptions: 由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= ...
- POJ_2386 Lake Counting (dfs 错了一个负号找了一上午)
来之不易的2017第一发ac http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS Memory Limit: 65536 ...
随机推荐
- 微软要冷落windows是天方夜谭还是势在必行
自从90年代开始,微软就统治着PC桌面市场,真正意义上地改变了世界,在很长一段时间内,Windows就和阳光.空气.水.电能一样,成为生活必需品,无处不在,又让人感觉不到其存在,正因如此,微软的市值于 ...
- Java中的注意点
1.源文件以.java结束,源文件的基本组成部分是类(class) 2.每个源文件只能有一个public类,源文件名必须和该类的类名一致 3.每个Java程序的执行入口都是main()方法,固定写法为 ...
- PLL到底是个啥么东西呢?
——————————————————更新于20180826———————————————————————————— PLL:完成两个电信号的相位同步的自闭环控制系统叫锁相环.用电压控制延时,用到了VC ...
- apache和tomcat的关系
apache和tomcat的关系: 举个例子:apache是一辆卡车,上面可以装一些东西如html等.但是不能装水,要装水必须要有容器(桶),tomcat就是一个桶(装像JAVA这样的水),而这个桶也 ...
- Oauth2.0 协议简介及 php实例代码
转自:http://www.dahouduan.com/2017/11/21/oauth2-php/ https://blog.csdn.net/halsonhe/article/details/81 ...
- C语言标准库 常用函数说明
void *memset(void *str, int c, size_t n) Syntax void *memset(void *str, int c, size_t n) Description ...
- break、continue与数组
一. 1.break与continue.这两个关键字一般放在循环的花括号里面使用.break——结束整个循环.continue——结束本次循环,进入下次循环. break的案例: int i = ...
- Android开发常见错误
1.出现 “Unable to resolve target 'android-9'”,解决办法: 一般移植别人工程会出现此错误. 右键项目文件--->properties--->andr ...
- 网络编程之C10K
网络编程之C10K 虽然在过去的十几年里C10K问题已经可以很好的解决,但学习网络编程时研究C10K问题仍然价值巨大,因为技术的发展都是有规律和线索可循的,了解C10K问题及其解决思路,通过举一反三, ...
- Android下的定时任务
Android中的定时任务一般有两种实现方式,一种是使用JavaAPI里的Timer类,另一种是使用android的Alarm机制. 这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显的 ...