算法百题斩其一: floodfill

写在前面:何所谓“斩”?

斩,即快速而有力地切断,指我们用最精简的语言,一针见血地点破算法题的核心难点。斩需三思而后行;斩需借助外力、旁征博引;斩需持之以恒、铁杵磨针!

1. 何为floodfill?

floodfill算法,中文名泛洪填充算法。顾名思义,即枚举图中每一个没有被填充的方块,以某种连通性规则去填充一片区域,迭代进行下去。(就好比你在某个格子放置一个水方块,然后其水淹四方一样,MC玩家狂喜~)
floodfill是一种搜索算法,可以用dfs或者bfs实现floodfill。floodfill一般用来遍历一张图,求连通块的个数

2.例题

例题一

分析+代码:

在这里插入代码片//floodfill模板题: 在八连通规则下求连通块个数
//要点:1.若用数组实现队列,bfs要开一个足够容纳所有状态的数组
//要点:2.双层循环加扣点实现八连通规则下的延申#include <iostream>using namespace std;#define x first//宏定义方便代码撰写
#define y second
typedef pair<int,int> PII;//定义一个pair类型在bfs中存二维点
const int N=1010,M=N*N;PII q[M];//!!注意队伍需要开n方的空间!!
char g[N][N];//存图
bool st[N][N];//bfs所需判重数组
int n,m,hh,tt;//队列头尾下标void bfs(int r,int c)
{hh=tt=0;q[0]={r,c};st[r][c]=true;while(tt>=hh){int x=q[hh].x, y=q[hh++].y;for(int i=x-1;i<=x+1;i++)for(int j=y-1;j<=y+1;j++){if(st[i][j])continue;if(i==x&&j==y)continue;if(i<0||i>=n||j<0||j>=m)continue;if(g[i][j]=='.')continue;q[++tt]={i,j};st[i][j]=true;}}
}
int main()
{cin>>n>>m;for(int i=0;i<n;i++)cin>>g[i];int ans=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(st[i][j]||g[i][j]=='.')continue;bfs(i,j);ans++;}cout<<ans<<endl;
}

例题二

分析+代码:

//floodfill模板题: 在利用二进制数表示连通性的图中进行floodfill,并统计连通块个数和最大连通块面积(一个n位二进制数唯一对应n个方向的墙存在与否的一种情况)
//要点:1.用数组实现四连通延申
//细节:1.#define 的用法,把用来替换的放在前面,被替换的关键词放在后面,不要加分号
#include <iostream>
#include <algorithm>using namespace std;
typedef pair<int,int>PII;
#define x first
#define y secondconst int N=55;
int g[N][N],dx[4]={0,-1,0,1},dy[4]={-1,0,1,0},hh,tt,m,n;//m是行数
PII q[N*N];
bool st[N][N];int bfs(int i,int j)
{hh=tt=0;q[0]={i,j};st[i][j]=true;int area=1;while(hh<=tt){int x=q[hh].x,y=q[hh++].y;int code=g[x][y];for(int k=0;k<4;k++){if(!(code>>k&1)){int x1=x+dx[k],y1=y+dy[k];if(st[x1][y1]||x1<0||x1>=m||y1<0||y1>=n)continue;area++;q[++tt]={x1,y1};st[x1][y1]=true;}}}return area;
}int main()
{cin>>m>>n;for(int i=0;i<m;i++)for(int j=0;j<n;j++)cin>>g[i][j];int cnt=0,area=0;for(int i=0;i<m;i++)for(int j=0;j<n;j++){if(!st[i][j]){area=max(area,bfs(i,j));cnt++;}}cout<<cnt<<endl;cout<<area<<endl;
}

例题三

//具有一种特殊连通规则(数值相等)的8连通floodfill,同时需要统计连通块的相邻块
#include <iostream>
#include <algorithm>using namespace std;const int N=1e3+10,M=1e6+10;
typedef pair<int,int> PII;
#define x first
#define y secondint g[N][N],n,hh,tt;
PII q[M];
bool st[N][N];void bfs(int r,int c,int &mount,int &valley)
{hh=tt=0; q[hh]={r,c};st[r][c]=true;bool mou=true,val=true;while(hh<=tt){int x=q[hh].x,y=q[hh++].y;for(int i=x-1;i<=x+1;i++)for(int j=y-1;j<=y+1;j++){if(i<0||i>=n||j<0||j>=n)continue;if(i==x&&j==y)continue;if(g[i][j]!=g[x][y]){if(g[i][j]>g[x][y])mou=false;else val=false;continue;}if(st[i][j])continue;st[i][j]=true;q[++tt]={i,j};}}mount+=mou;valley+=val;
}
int main()
{cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>g[i][j];int mount=0,valley=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(!st[i][j])bfs(i,j,mount,valley);}cout<<mount<<" "<<valley<<endl;}

# 算法百题斩其一: floodfill相关推荐

  1. 算法百题斩其三: 单源最短路与算法——其一

    算法百题斩其三: 单源最短路与算法--其一 写在前面:何所谓"斩"? 斩,即快速而有力地切断,指我们用最精简的语言,一针见血地点破算法题的核心难点.斩需三思而后行:斩需借助外力.旁 ...

  2. 前端百题斩【006】——js中三类字符串转数字的方式

    写该系列文章的初衷是"让每位前端工程师掌握高频知识点,为工作助力".这是前端百题斩的第6斩,希望朋友们关注公众号"执鸢者",用知识武装自己的头脑. js中字符串 ...

  3. 五万字前端面试宝典——前端百题斩(上)新鲜出炉

    从2021年5月9号开始更新<前端百题斩>,目前终于取得了阶段性成果,<前端百题斩>上册已经更新完毕,内容包括JS基础篇.浏览器篇.网络篇,共计50个章节,5万多字.关注公众号 ...

  4. 前端百题斩【015】——快速手撕call、apply、bind

    写该系列文章的初衷是"让每位前端工程师掌握高频知识点,为工作助力".这是前端百题斩的第15斩,希望朋友们关注公众号"执鸢者",用知识武装自己的头脑. 在百题斩[ ...

  5. 前端百题斩【010】——通俗易懂的JavaScript执行上下文

    写该系列文章的初衷是"让每位前端工程师掌握高频知识点,为工作助力".这是前端百题斩的第10斩,希望朋友们关注公众号"执鸢者",用知识武装自己的头脑. JavaS ...

  6. 前端百题斩【017】——一基础、二主线、双机制理解原型链

    写该系列文章的初衷是"让每位前端工程师掌握高频知识点,为工作助力".这是前端百题斩的第17斩,希望朋友们关注公众号"执鸢者",用知识武装自己的头脑. 17.1 ...

  7. 前端百题斩【018】——从验证点到手撕new操作符

    写该系列文章的初衷是"让每位前端工程师掌握高频知识点,为工作助力".这是前端百题斩的第18斩,希望朋友们关注公众号"执鸢者",用知识武装自己的头脑. 18.1 ...

  8. 前端百题斩【028】——浏览器中的请求们

    写该系列文章的初衷是"让每位前端工程师掌握高频知识点,为工作助力".这是前端百题斩的第28斩,希望朋友们关注公众号"执鸢者",用知识武装自己的头脑. 通过浏览器 ...

  9. 前端百题斩【019】——数组中方法原理早知道

    写该系列文章的初衷是"让每位前端工程师掌握高频知识点,为工作助力".这是前端百题斩的第19斩,希望朋友们关注公众号"执鸢者",用知识武装自己的头脑. js的Ar ...

最新文章

  1. 虚拟化服务器端口用万兆,万兆以太网部署需要注意的方面有哪些
  2. (转)一个vue路由参数传递的注意点
  3. 计算机硬件市场调查清单,微型计算机组装与维护实用教程王际川第8章节组装计算机.ppt...
  4. 做小程序费用太高?帮你选一个最省钱的方案
  5. 黄开宁:搞多媒体开发要掌握好信号处理、统计和数理分析
  6. java字符串深克隆_Java中对象的深复制(深克隆)和浅复制(浅克隆)之序列化...
  7. Call for Papers | IEEE/IAPR IJCB 2022 会议
  8. SpringBoot的Bean之基本定义与使用
  9. Mac下安装MySQL(Mac 10.12)
  10. 为什么我们要升级到 iOS 12.1.3?
  11. Android进阶: 10分钟实现NDK-JNI 开发教程
  12. 带前端脚本的html页面,2.从头学前端之如何在html中使用javascript
  13. 北大AI第八讲 李航 自然语言处理的现实与挑战--李航 VS 雷鸣 对话全文
  14. IP路由原理.ppt
  15. Eviews10下载及安装
  16. VS2019打包生成安装文件教程(详细实操版)
  17. html语言标题怎么居中,HTML – 如何在标题中垂直居中文本?
  18. 1080p和1080i有什么区别?
  19. ZOJ1516 Uncle Tom's Inherited Land(二分图最大匹配)
  20. 如何搭建java环境_vscode搭建java环境

热门文章

  1. P4338 [ZJOI2018]历史(树剖)(暴力)
  2. 腾讯范围经济_耳朵经济的2020变数:腾讯音乐与喜马拉雅、蜻蜓们展开厮杀
  3. 语音对讲软件_三星推出带对讲机按钮智能手机:可通过微软软件发起语音对讲...
  4. 使用putty从windows向远程服务器传递文件
  5. 微信小游戏学习日记2
  6. 光纤传像束原理、特点和主要参数简介
  7. MDTools非常专业的液压阀块设计软件
  8. 至少8位密码,包括大写、小写、数字、特殊字符中的三种即可!
  9. 三菱d700变频器接线图_三菱变频器d700参数设置_三菱d700变频器代码故障_三菱d700接线图...
  10. java-php-net-python-绿色果蔬网 计算机毕业设计程序