Floodfill算法——求独立子图个数
Floodfill——漫水填充法(也称种子填充法)
简单来说就是求一个图中独立子图的个数并将其描述出不同的状态。
Floodfill在计算机图形学有着非常广泛的运用,比如图像分割、物体识别之类。
基于Floodfill算法的实现例子有Windows下“画图”软件的油漆桶工具,photoshop的魔术棒选择工具等等。
具体算法实现方法是:查找种子点周边的点,将与种子点颜色相近的点(可以设置一个阈值)入队作为
新种子,并对新入队的种子也进行同样的扩展操作,这样就选取了和最初种子相近颜色的区域。
现在有一个问题,给你一片海域的海域图,0代表海洋,1~9都表示陆地。求这片海域有多少独立的小岛,
并将他们表示成不同的状态。
代码如下:
#include <stdio.h>
#include <stdlib.h>
][],book[][],width,lenth,sum;
// 定义一个方向数组
][] = {
{ , },{ , },{ ,- },{ -, }
};
void DFS(int x, int y, int color)
{
int k, tx, ty;
map[x][y] = color; // 对map[x][y]进行染色
; k < ; k++) // 枚举四种移动方式
{
// 下一步的坐标
tx = x + move[k][];
ty = y + move[k][];
// 判断状态是否合法
|| ty< || tx>=lenth || ty>=width) continue;
&& book[tx][ty] == )
{
sum++;
book[tx][ty] = ;
DFS(tx, ty, color);
}
}
return;
}
int main(void)
{
;
scanf("%d %d", &lenth, &width);
// 读入地图
; i < lenth; i++)
; j < width; j++)
scanf("%d", &map[i][j]);
// 对每一个大于0的点尝试进行DFS染色
;i<lenth;i++)
; j < width; j++)
{
)
{
num--; // 颜色的编号
// 每发现一个小岛应该染以不同的颜色,因此递减
book[i][j] = ;
DFS(i, j, num);
}
}
// 打印已经染色后的地图
; i < lenth; i++)
{
; j < width; j++)
{
printf("%3d", map[i][j]);
}
putchar('\n');
}
// 输出小岛的个数
printf("有%d个小岛\n", -num);
system("pause");
;
}
可以输入以下数据进行验证:
5 5
1 2 1 0 0
3 0 2 0 1
4 0 1 0 1
3 2 0 0 0
1 0 0 5 5
运行结果如下:
-1 -1 -1 0 0
-1 0 -1 0 -2
-1 0 -1 0 -2
-1 -1 0 0 0
-1 0 0 -3 -3
Floodfill算法——求独立子图个数的更多相关文章
- Tarjan算法求割点
(声明:以下图片来源于网络) Tarjan算法求出割点个数 首先来了解什么是连通图 在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称 ...
- floodfill算法解题示例
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法.因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名.在GNU Go和扫雷中,Floo ...
- Dijkstra算法求单源最短路径
Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...
- ZOJ Problem - 2588 Burning Bridges tarjan算法求割边
题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...
- PAT L2-013 红色警报(并查集求连通子图)
战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不 ...
- POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)
题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...
- POJ-2195 Going Home---KM算法求最小权值匹配(存负边)
题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...
- _DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4] ...
- _DataStructure_C_Impl:Dijkstra算法求最短路径
// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...
随机推荐
- Android app作为系统应用实现功能笔记
1.禁用StatusBar相关功能需要添加权限 <uses-permission android:name="android.permission.STATUS_BAR"&g ...
- bower工具的简单使用
基于NodeJS的一个静态资源管理工具,由twitter公司开发维,解决大型网站中静态资源的依赖问题. 1.依赖NodeJS环境和git工具. 2.npm install -g bower安装bowe ...
- 表单与JQuery
表单: Html标签注意: 1.提交action 2.提交按钮:类型一定为type="submit" ,不然无反应 3. Jquery: 个人认为属于JS 1.一般不用表单提交 2 ...
- ubuntu下百度云安装
1.安装 在github上下载 .deb 安装包 下载地址 https://github.com/LiuLang/bcloud-packages 下载完成双击安装文件安装成功 2.解决验证码问题 (1 ...
- android使用shape做selector按钮按下和弹起的动画
平时效果: 按下效果: selector代码: <?xml version="1.0" encoding="utf-8"?> <selec ...
- Python查询MySQL进行远程采集图片实例
这是四五年以前做小说站采集图片时写过唯一一次 Python 代码 #!/usr/bin/python #-*-coding:utf-8-*- import MySQLdb, os, socket, t ...
- L3-002. 堆栈
L3-002. 堆栈 题目链接:https://www.patest.cn/contests/gplt/L3-002 线段树 线段树的数据修改和查询都是O(lgn)的,此题只需维护各个区间内的数的个数 ...
- JavaScript 运动框架 Step by step(转)
1,运动原理 Js运动,本质来说,就是让 web 上 DOM 元素动起来.而想要 DOM 动起来,改变其自身的位置属性,比如高宽,左边距,上边距,透明度等.动画的原理就是把不同状态的物体,串成连续的样 ...
- HttpWebRequest的简单使用
新建新的空网站和一个default.aspx页面测试,实验例子: using System; using System.Collections.Generic; using System.IO; us ...
- 印象烟大PPT大赛
下面为获奖人员 王志恒一等奖 姜云飞.任子仪二等奖 田正相,庄棫麟,陈德昊三等奖.