floodfill算法解题示例
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。在GNU Go和扫雷中,Flood Fill算法被用来计算需要被清楚的区域。
算法实现
最简单的实现方法是采用深度优先搜索的递归方法,也可以采用广度优先搜索的迭代来实现。
void flood_fill(int x,int y,int color)
{
area[x][y]=color;
if(x>0&&area[x-1][y]==0)flood_fill(x-1,y,color);
if(y>0&&area[x][y-1]==0)flood_fill(x,y-1,color);
if(x<MAX_X&&area[x+1][y]==0)flood_fill(x+1,y,color);
if(y<MAX_Y&&area[x][y+1]==0)flood_fill(x,y+1,color); }
——————维基百科:http://zh.wikipedia.org/wiki/Flood_fill
1002: 当不成勇者的Water只好去下棋了
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 110 Solved: 47
[Submit][Status][Web Board]
Description
由于魔王BOSS躲起来了,说好要当勇者的Water只好去下棋了,他很厉害,基本每局必输。
Water总是不知道为什么把自己的棋下得东一块西一块,而块与块之间总是被对手的棋隔开。概率统计挂了的Water一直没搞清楚到底自己被别人分成了多少块,又来找你帮忙。
假定Water的棋为X,对手的棋为O。
给出一个矩阵棋盘,上面布满了棋子,求Water的棋子究竟被对手分成了多少块?
(为了和谐,我们还是用0011代表OOXX)
Input
第一行为n, m。 (0 < n,m <= 100)
接下来 n 行 m 列为01矩阵。
1 为Water的棋。
Output
每组数据输出一行,表示块数。
Sample Input
2 2
01
10
2 3
101
011
Sample Output
2
2
HINT
Source
#include<iostream>
using namespace std;
struct Dir {
int x;
int y;
};
struct Node {//节点的结构为:x,y为下标,dir[4]为该节点的四个方向,color用来表示是否已经被访问(不为0)以及在第几个块的,g为该节点在图中的值
int x;
int y;
Dir dir[];
int color;
char g;
Node() {
x = ;
y = ;
color = ;
g = ' ';
dir[].x = x-;
dir[].y = y;
dir[].x = x;
dir[].y = y+;
dir[].x = x+;
dir[].y = y;
dir[].x = x;
dir[].y = y-;
}
void setDir(int x_, int y_) {//设置节点的方向 ,刚做题时忘记了,搞得color值不会变化
dir[].x = x_-;
dir[].y = y_;
dir[].x = x_;
dir[].y = y_+;
dir[].x = x_+;
dir[].y = y_;
dir[].x = x_;
dir[].y = y_-;
}
};
int color_ = ;
int m;
int n;
bool ValidNode(Node& node, int m, int n) {//判断一个节点是否有效,在本题中有效的条件是没有越界还有该临近节点(g=1)未被访问过 ,即color=0 ,同时要使用引用才能在该函数内改变该引用变量的值
if ((node.x >= && node.x < m) && (node.y >= && node.y < n)) {
if (node.color == && node.g == '')
return true;
}
return false;
}
void initialize(Node (*total)[]) {//初始化图
char qi;
for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) {
cin >> qi;
total[i][j].x = i;
total[i][j].y = j;
total[i][j].g = qi;
total[i][j].setDir(i, j);//setDir不能忘记了,不然该节点的四个方向不能与下标x,y对应
}
}
}
void floodfill(Node (*total)[], Node& node) {//floodfill算法递归访问临近节点,并将color值修改,以表示访问过和记录在第几块,别忘了引用
node.color = color_;
for (int i = ; i < ; i++) {
if (ValidNode(total[node.dir[i].x][node.dir[i].y], m, n))
floodfill(total, total[node.dir[i].x][node.dir[i].y]);
}
}
int main() {
while (cin >> m >> n) {
Node qipan[][];
initialize(qipan);
/*cout << "初始化的图:g+color" << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << qipan[i][j].g << qipan[i][j].color << " ";
}
cout << endl;
}*/
for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) {
if (ValidNode(qipan[i][j], m, n)) {
color_++;
floodfill(qipan, qipan[i][j]);
}
}
}
/*cout << "分块后的图:g+color" << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << qipan[i][j].g << qipan[i][j].color << " ";
}
cout << endl;
}*/
/*cout << "color的值,即分为了多少块:"; */
cout << color_ << endl;//此时color值就是图被分成几块
color_ = ;//color_这个全局变量要复位为0,以便下一次使用 }
return ;
} /**************************************************************
Problem: 1002
User: 12330344
Language: C++
Result: Accepted
Time:584 ms
Memory:1680 kb
****************************************************************/
输出结果:4*4为例:

图遍历算法——DFS、BFS、A*、B*和Flood Fill 遍历算法大串讲:http://dsqiu.iteye.com/blog/1689130
floodfill算法解题示例的更多相关文章
- FloodFill算法详解及应用
啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色. 这种算法思想还在许多其他地方有应用.比如说扫雷 ...
- leedcode算法解题思路
1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...
- Floodfill算法——求独立子图个数
Floodfill--漫水填充法(也称种子填充法)简单来说就是求一个图中独立子图的个数并将其描述出不同的状态.Floodfill在计算机图形学有着非常广泛的运用,比如图像分割.物体识别之类.基于Flo ...
- C#与JAVA平台RSA算法交互示例
很久以前的文章中,演示了如何对于.net和win32下面的delphi的RSA互操作性的实现,对于C#和JAVA之前的RSA加密解密也是很简单的,一般都采用了标准的规范,所以在互操作性方面是很方便的. ...
- RAS算法简单示例(Java版)
RSA算法——由三位发明者Ronald Rivest.Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成. RSA算法属于“公开密钥加密技术”,其加密和解密的秘钥不同. ...
- 《机器学习实战》之k-近邻算法(示例)
看了这本书的第一个算法—k-近邻算法,这个算法总体构造思想是比较简单的,在ACM当中的话就对应了kd树这种结构.首先需要给定训练集,然后给出测试数据,求出训练集中与测试数据最相近的k个数据,根据这k个 ...
- MD5散列算法的示例
在很多地方,都用到了数据加密,比较多的就是MD5了,也比较安全,下面就贴上个示例,输入一串字符串,通过MD5加密 加密算法如下 public static string MD5_Encrypt(str ...
- LaTeX 一些用法实例(并列图片、并列表格、算法代码示例、页眉太长、下划线,等)
横向并列两个图片 \begin{figure} \begin{minipage}{0.49\linewidth} \centering \includegraphics[width=6.5cm]{Si ...
- 3、回溯算法解题套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
随机推荐
- png图片那点事
PNG图片格式现在包含三种类型: 1.PNG8 256色PNG的别名 2.PNG24 全色PNG的别名 3.PNG32 全色PNG的别名 基本上PNG32就是PNG24,但 ...
- j简单的递归
1 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有的信都装错信封共有多少种不同情况. 归纳法例子 1.有n个硬币(n为偶数)正面朝上排成一排,每次将n-1个硬币翻成朝上为止.编程让计算机把 ...
- innodB的隐式锁
http://blog.csdn.net/taozhi20084525/article/details/19545231 一.知识准备之隐式锁 参考:http://www.uml.org.cn/sjj ...
- debian7 编译qtopia错误解决案例
问题: kernel/qjpegio.cpp:60:21: error: jpeglib.h: No such file or directory 解决 sudo apt-get install li ...
- Python编码相关文章推荐
Table of Contents 1. 分享 分享 python2里面编码对很多人来说是个很头疼的问题,今天分享一篇编码相关的文章,是前几天读到的相比于大部分解释编码问题的一知半解模糊不清,这篇写得 ...
- IOS plist轻量级操作
plist,全名PropertyList,即属性列表文件,它是一种用来存储串行化后的对象的文件.这种文件,在ios开发过程中经常被用到.这种属性列表文件的扩展名为.plist,因此通常被叫做plist ...
- iOS 应用程序的生命周期
iOS 应用程序的生命周期(网络资源总结) http://blog.csdn.net/totogo2010/article/details/8048652 http://www.cocoachina. ...
- setsockopt
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO ...
- Android小项目之二 代码的组织结构
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...
- 手机端Post 数据
var data =""; using (StreamReader readStream = new StreamReader(context.Reques ...