DFS实现floodfill算法
- 题目:
- 分析与解答
题目:
多组案例,每组案例输入一个m行n列的字符矩阵,统计字符‘@’组成多少个连通块。如果两个字符‘@’所在的格子相邻(横、竖或对角线),则说明它们属于同一连通块。
Sample Input
1 1*3 5*@*@***@***@*@*1 8@@****@*5 5****@*@@*@*@**@@@@*@@@**@0 0
Sample Output
0122
分析与解答
1.找到油田,然后通过循环遍历他周围的八个位置,不断调用dfs函数,如果连通,则讲连通分量标号
2.循环,找没标记过的油田,然后继续进行1,标号增加
3.油田均已标记完,此时输出标号,就是连通块个数
怎么写bfs:
结束递归的条件有两个,一个是超过了格子的范围,另一个是之前曾经出现过,以及这个格子不是油田。找的话每个油田做标号,是同一联通区域的标上一样的号,最后输出最终的标号即可。调用时机:if(idx[i][j]==0&&pic[i][j]==’@’)这个数没标记过,而且属于油田。bfs里面用两个for循环直接把他八个方向都扫描了一遍,并且如果满足条件就进行初始化,此时如果在同一个连通区域他们的值是相同的,所以main里调用bfs时一定是发现了不同的连通区域,如果要求不同连通区域个数,就只用在main里面更改cnt的个数
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100+5;
char pic[maxn][maxn];
int m,n,idx[maxn][maxn];void DFS(int r,int c,int id)
{if(r<0||r>=m||c<0||c>=n) return ;if(idx[r][c]>0||pic[r][c]!='@') return ;idx[r][c]=id;for(int dr=-1;dr<=1;dr++)for(int dc=-1;dc<=1;dc++)if(dr!=0||dc!=0)DFS(r+dr,c+dc,id);
}
int main()
{while(scanf("%d%d",&m,&n)!=EOF&&m&&n){for(int i=0;i<m;i++) scanf("%s",pic[i]);memset(idx,0,sizeof(idx));int cnt=0;for(int i=0;i<m;i++)for(int j=0;j<n;j++)if(idx[i][j]==0&&pic[i][j]=='@')DFS(i,j,++cnt);printf("%d\n",cnt);}return 0;
}
也可以写八条DFS调用
#include<cstdio>
#include <cstring>
using namespace std;
#define maxn 105
char a[maxn][maxn];
bool vis[maxn][maxn];
int n,m;
void DFS(int x,int y)
{if(x<0||x>=n||y<0||y>=m) return ;if(a[x][y]=='*'||vis[x][y]) return;vis[x][y]=true;DFS(x+1,y+1);DFS(x+1,y);DFS(x+1,y-1);DFS(x,y-1);DFS(x-1,y-1);DFS(x-1,y);DFS(x-1,y+1);DFS(x,y+1);
}
int main()
{while(scanf("%d%d",&n,&m)!=EOF){if(n+m==0) break;for(int i=0; i<n; i++)scanf("%s",a[i]);int sum=0;memset(vis,false,sizeof(vis));for(int i=0; i<n; i++)for(int j=0; j<m; j++)if(!vis[i][j]&&a[i][j]=='@'){DFS(i,j);sum++;}printf("%d\n",sum);}return 0;
}
DFS实现floodfill算法相关推荐
- 根据坐标如何标记图片_如何玩转FloodFill算法?
读完本文,你可以去力扣拿下如下题目: 733.图像渲染 ----------- 啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可 ...
- FloodFill算法详解及应用
FloodFill算法详解及应用 啥是 FloodFill 算法呢, 最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色. 这种算法思 ...
- LeetCode Surrounded Regions(floodfill算法)
问题:一个由X,O字符填充的二维数组,问由O包围起来的X,其中O与边界的不计算在内. 思路:floodfill算法 ,先求出O构成的连通,将这些剔除后,就是由O包围起来的X 具体代码参考: https ...
- C# 面向对象版 Windows挖雷 v0.8 release 非FloodFill算法解
受园子里博友的激发<C#实现扫雷出炉> http://www.cnblogs.com/magicdlf/archive/2009/04/28/1444953.html 花了2天时间写了如附 ...
- DFS(深度优先搜索)算法实现
2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...
- Flood-Fill算法
Flood-Fill算法主要用于网格图. 从起点出发,分别枚举四个方向的邻格,判断是否为陆地,过程宛若洪水漫延. 例题链接:红与黑 BFS实现 #include <iostream> #i ...
- DFS (深度优先算法)
文章目录 前言 一.DFS是什么? 二.DFS的使用步骤? 三.N皇后问题 总结 前言 离上次的博客已经有5天了,虽然没人关注我,但是我还是想说:我没有在偷懒,只是最近复习的知识,我觉得要自己领悟透彻 ...
- [算法] 二叉树的DFS与BFS算法 (Java) -- 痛定思痛 彻底搞懂
二叉树的DFS与BFS算法 (Java) 1.概念 ①DFS (深度优先搜索) 维基百科读一遍 定义看完, 看一遍gif ②BFS (广度优先搜索) 维基百科读一遍 gif看一遍 2. 算法实现 二叉 ...
- (UVA 1103) Ancient Meesages(DFS连通分量计数+种子填充floodfill算法)
原题: UVA 1103 洛谷 古代象形符号 问题描述 问题输入输出 输入 输出 输入输出样例 Input: 6 2 00 7c 44 7c 30 00 6 25 000000000000000000 ...
最新文章
- EXT3与EXT4的主要区别
- java异常return笔试题_Java笔试面试总结—try、catch、finally语句中有return 的各类情况...
- chrome下input[type=text]的placeholder不垂直居中的问题解决
- 【渝粤教育】国家开放大学2018年春季 0222-22T模拟电子电路 参考试题
- Spring 依赖注入的实现
- Redis中的批量删除数据库中的Key
- 查看oracle小补丁号,oracle 补丁号查询
- 大数据分析技术有哪些类型
- 自定义音乐播放器的歌词显示view
- 2021-01-18
- 人人都可以参与开源!龙蜥社区最不容错过的开发者活动来了
- android 清理系统垃圾,安卓手机怎么清理系统垃圾
- 设计模式之观察者模式详解(附应用举例实现)
- 使用pytorch自己从头搭建一个Lenet分类器网络及其训练、检测脚本
- 局部加权回归LOESS
- 74-内存和外存的知识点
- “二选一”突袭,暗战“山姆”?
- iphonex时间显示蓝色_遨游M5 EX敢于打出与苹果iPhone X一样的价格,有特色之处,看下...
- 基于计算机视觉的梦幻西游辅助脚本(只用于开发学习技术)
- 【Windows C++】调用powershell上传指定目录下所有文件
热门文章
- linux ubuntu 编写c/c++ 获取命令行传入参数示例
- 蓝桥杯试题 算法提高 数组求和
- 计算机领域hpec会议,2018 IEEE High Performance extreme Computing Conference HPEC
- gin的Bindxxx和ShouldBindxxx的区别
- Eclipse配置自动补齐键为alt+/
- echarts 折线上写数值_前端ECharts数据可视化图表案例与介绍
- python提示对话框自动关闭_Python实现定时自动关闭的tkinter窗口方法
- 大数据数据收集数据困难_大数据就是好数据吗?研究人员在处理大数据集时遭遇的 5 大挑战...
- 台式计算机总是重启,台式电脑经常自动重启怎么修复
- linux mei swap,Linux swapoff命令