种子填充找连通块 floodfill
Description
Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.
Output
Sample Input
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
Sample Output
3
Hint
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
题目意思:输入行数列数,m,n。然后输入像上面的字符。找连着的W有多少块.....
解题思路:首先用一个二维字符数组把输入的存起来.... 然后一个一个的循环,如果是W并且还没有被标记过就进入zhao这个函数
zhao函数:找嘛,大概意思就是,看当前位置的8个方向有没有连通的,这里用到了递归。希望代码上的注释,对你有帮助。
(其实,自己对这代码的意思也是似懂非懂,找书打出来的)
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=;
int m,n; //这里将m,n定义在主函数外,作为全局变量,好被zhao函数调用
char s[maxn][maxn];
int d[maxn][maxn];
void zhao(int r,int c,int b)
{
if(r<||r>=m||c<||c>=n) //出界的,不要
return;
if(d[r][c]>||s[r][c]!='W') // 不是W,或者已经访问标记过了的格子
return;
d[r][c]=b; //给访问过的格子标记
for(int dr=-;dr<=;dr++) //这两个循环是表示一个格子的八个方向
{
for(int dc=-;dc<=;dc++)
if(dr!=||dc!=) //这里不要0,0的格子,因为这就是它本身,并没有动
zhao(r+dr,c+dc,b); //递归,将dr,dc加上去,这样就寻找了附近的格子
}
} int main()
{ memset(d,,sizeof(d)); //将d数组清零,好标记
while(cin>>m>>n)
{
int flag=;
for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
cin>>s[i][j];
}
for(int i=; i<m; i++)
{
for(int j=; j<n; j++)
{
if(d[i][j]==&&s[i][j]=='W')
zhao(i,j,++flag);
}
}
cout<<flag<<endl;
}
return ;
}
种子填充找连通块 floodfill的更多相关文章
- 用DFS求连通块(种子填充)
[问题] 输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块.如果两个字符“@”所在的格子相邻(横.竖或者对角线方向),就说它们属于同一个八连块.例如,图6-9中有两个八连块. 图6-9 [分 ...
- ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通.每次可翻转一个连通块X( ...
- UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)
UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...
- HDU - 1241 POJ - 1562 Oil Deposits DFS FloodFill漫水填充法求连通块问题
Oil Deposits The GeoSurvComp geologic survey company is responsible for detecting underground oil de ...
- DFS求连通块(漫水填充法)
G - DFS(floodfill),推荐 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I6 ...
- DFS入门之二---DFS求连通块
用DFS求连通块也是比较典型的问题, 求多维数组连通块的过程也称为--“种子填充”. 我们给每次遍历过的连通块加上编号, 这样就可以避免一个格子访问多次.比较典型的问题是”八连块问题“.即任意两格子所 ...
- UVA 572 Oil Deposits油田(DFS求连通块)
UVA 572 DFS(floodfill) 用DFS求连通块 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format: ...
- CGA填充算法之种子填充算法
CGA填充算法之种子填充算法 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界 (也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜 ...
- 种子填充算法描述及C++代码实现
项目需要看了种子填充算法,改进了算法主要去除面积小的部分.种子填充算法分为两种,简单的和基于扫描线的方法,简单的算法如下描述(笔者针对的是二值图像): (1)从上到下,从左到有,依次扫描每个像素: ( ...
随机推荐
- Android(java)学习笔记96:如何改变spinner系统自带的字体和颜色
1.首先我们要知道spinner系统自带字体和颜色本质: 原生的Spring 控件是无法更改字体和颜色的... 从下面的代码可以看出...红色的标注显示使用的是Android默认的布局.. Spinn ...
- [转]永久告别Android的背景选择器Selector!无需切很多图了!
package com.zoke.custom.autobg; import android.content.Context; import android.content.res.TypedArra ...
- 编写一个单独的Web Service for Delphi
早段时间看了一篇好文章,对其整理成以下几步 1新建一个SOAP Server Application,在提示输入接口时输入MyHello,把所有文件保存在一个叫Ser的目录下,其中一个包含TWebMo ...
- 【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)
Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of ...
- JavaScript 三种绑定事件方式之间的区别
JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...
- Linux 命令 - fg & bg: 将进程切换到前台(后台)运行
后台运行的进程不会受到任何键盘的影响,包括试图用来中断它的 Ctrl-C 键.想要使得进程返回到前台来运行,可以使用 fg 命令来实现. 可以通过在 fg 命令后面加上百分比符号和作业编号(称为 jo ...
- 程序生成SiteMapPath文件
//创建站点地图 private void CreateSiteMap(DataSet ds) { XmlDeclaration declareation; declareation = xmlDoc ...
- WCF Membership and Role Provider
本文介绍的是如何使用Membership 和 Role Provider 来控制 WCF 调用方法的权限. 比如我们有一个WCF Method 叫 GetData(int num),然后我们只允许Ro ...
- HDOJ2016数据的交换输出
数据的交换输出 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Android--简单的三级菜单
关于这个菜单应该在很多播放器应用里面可以看见,直接先上两张效果图吧,一张是该Demo的效果图,一张是优酷手机客户端的效果图. ...