• 题目:

    • 分析与解答

题目:

多组案例,每组案例输入一个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算法相关推荐

  1. 根据坐标如何标记图片_如何玩转FloodFill算法?

    读完本文,你可以去力扣拿下如下题目: 733.图像渲染 ----------- 啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可 ...

  2. FloodFill算法详解及应用

    FloodFill算法详解及应用 啥是 FloodFill 算法呢, 最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色. 这种算法思 ...

  3. LeetCode Surrounded Regions(floodfill算法)

    问题:一个由X,O字符填充的二维数组,问由O包围起来的X,其中O与边界的不计算在内. 思路:floodfill算法 ,先求出O构成的连通,将这些剔除后,就是由O包围起来的X 具体代码参考: https ...

  4. C# 面向对象版 Windows挖雷 v0.8 release 非FloodFill算法解

    受园子里博友的激发<C#实现扫雷出炉> http://www.cnblogs.com/magicdlf/archive/2009/04/28/1444953.html 花了2天时间写了如附 ...

  5. DFS(深度优先搜索)算法实现

    2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...

  6. Flood-Fill算法

    Flood-Fill算法主要用于网格图. 从起点出发,分别枚举四个方向的邻格,判断是否为陆地,过程宛若洪水漫延. 例题链接:红与黑 BFS实现 #include <iostream> #i ...

  7. DFS (深度优先算法)

    文章目录 前言 一.DFS是什么? 二.DFS的使用步骤? 三.N皇后问题 总结 前言 离上次的博客已经有5天了,虽然没人关注我,但是我还是想说:我没有在偷懒,只是最近复习的知识,我觉得要自己领悟透彻 ...

  8. [算法] 二叉树的DFS与BFS算法 (Java) -- 痛定思痛 彻底搞懂

    二叉树的DFS与BFS算法 (Java) 1.概念 ①DFS (深度优先搜索) 维基百科读一遍 定义看完, 看一遍gif ②BFS (广度优先搜索) 维基百科读一遍 gif看一遍 2. 算法实现 二叉 ...

  9. (UVA 1103) Ancient Meesages(DFS连通分量计数+种子填充floodfill算法)

    原题: UVA 1103 洛谷 古代象形符号 问题描述 问题输入输出 输入 输出 输入输出样例 Input: 6 2 00 7c 44 7c 30 00 6 25 000000000000000000 ...

最新文章

  1. EXT3与EXT4的主要区别
  2. java异常return笔试题_Java笔试面试总结—try、catch、finally语句中有return 的各类情况...
  3. chrome下input[type=text]的placeholder不垂直居中的问题解决
  4. 【渝粤教育】国家开放大学2018年春季 0222-22T模拟电子电路 参考试题
  5. Spring 依赖注入的实现
  6. Redis中的批量删除数据库中的Key
  7. 查看oracle小补丁号,oracle 补丁号查询
  8. 大数据分析技术有哪些类型
  9. 自定义音乐播放器的歌词显示view
  10. 2021-01-18
  11. 人人都可以参与开源!龙蜥社区最不容错过的开发者活动来了
  12. android 清理系统垃圾,安卓手机怎么清理系统垃圾
  13. 设计模式之观察者模式详解(附应用举例实现)
  14. 使用pytorch自己从头搭建一个Lenet分类器网络及其训练、检测脚本
  15. 局部加权回归LOESS
  16. 74-内存和外存的知识点
  17. “二选一”突袭,暗战“山姆”?
  18. iphonex时间显示蓝色_遨游M5 EX敢于打出与苹果iPhone X一样的价格,有特色之处,看下...
  19. 基于计算机视觉的梦幻西游辅助脚本(只用于开发学习技术)
  20. 【Windows C++】调用powershell上传指定目录下所有文件

热门文章

  1. linux ubuntu 编写c/c++ 获取命令行传入参数示例
  2. 蓝桥杯试题 算法提高 数组求和
  3. 计算机领域hpec会议,2018 IEEE High Performance extreme Computing Conference HPEC
  4. gin的Bindxxx和ShouldBindxxx的区别
  5. Eclipse配置自动补齐键为alt+/
  6. echarts 折线上写数值_前端ECharts数据可视化图表案例与介绍
  7. python提示对话框自动关闭_Python实现定时自动关闭的tkinter窗口方法
  8. 大数据数据收集数据困难_大数据就是好数据吗?研究人员在处理大数据集时遭遇的 5 大挑战...
  9. 台式计算机总是重启,台式电脑经常自动重启怎么修复
  10. linux mei swap,Linux swapoff命令