题目描述

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。

你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式

输入包括多个数据集合。

每个数据集合的第一行是两个整数 W
和 H,分别表示 x 方向和 y

方向瓷砖的数量。

在接下来的 H
行中,每行包括 W

个字符。每个字符表示一块瓷砖的颜色

规则如下

1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。
** 输出格式 **

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
** 数据范围 **

$ 1≤W,H≤20 $

输入样例

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0

输出样例

45

Flood fill 算法 (针对网格题)

BFS 解题思路

1.找到 @ 起始位置。
2.将 第一个坐标入队 (@的位置),入队后 该坐标标记已走过。
3.遍历队头坐标的四个邻点,如果不越界,或者未走过 。该坐标标记已走过 并且入队。
4.队不空,一直循环往复。

需要注意的点

** 1.偏移量 **

            //偏移量 : {上,右,下,左} int dx[]={-1,0,1, 0}; //行方向 int dy[]={ 0,1,0,-1}; //列方向

2.需要用到坐标,可以使用pair

typedef pair<int,int> PII;
#define x first
#define y second..
queue<PII>q;
q.push({sx,sy}); // @ 坐标  入队。

BFS

#include<bits/stdc++.h>
using namespace std;typedef pair<int,int> PII;
#define x first
#define y secondint m,n;
char g[25][25];int bfs(int sx,int sy)
{queue<PII>q;q.push({sx,sy}); // @ 坐标  入队。g[sx][sy]='#'; // 入队后 ,标记已走过。int res=0;//偏移量 : {上,右,下,左} int dx[]={-1,0,1, 0}; //行方向 int dy[]={ 0,1,0,-1}; //列方向while(q.size()) {PII t= q.front();q.pop();res++;for(int i=0;i<4;i++) //遍历 四个方向的邻点 {int x=t.x+dx[i],y=t.y+dy[i];if(x<0||x>=n||y<0||y>=m||g[x][y]!='.')continue;g[x][y]='#';q.push({x,y});} }return res;
}
int main()
{ while(cin>>m>>n,n||m)  // m  列  n  行 {for(int i=0;i<n;i++) cin>>g[i]; //输入n行字符串int x,y;// @ 所在位置的坐标for(int i=0;i<n;i++)         // 寻找 @的所在位置 for(int j=0;j<m;j++)if(g[i][j]=='@'){x=i;y=j;} cout<<bfs(x,y)<<endl;        }return 0;
}

DFS 解题思路

1.找到 @ 起始位置。
2.将 第一个坐标入队 (@的位置),入队后 该坐标标记已走过。
3.遍历队头坐标的四个邻点,如果不越界,或者未走过 , 递归调用dfs()。

核心代码

int dfs(int x,int y)
{int res=1;g[x][y]='#'for(int i=0;i<4;i++) //遍历 四个方向的邻点 {int a=x+dx[i],b=y+dy[i];if(x<0&&x>=n&&y<0&&y>=m&&g[x][y]=='.')res+=dfs(a,b);} return res;
}

DFS

#include<bits/stdc++.h>
using namespace std;//偏移量 : {上,右,下,左} int dx[]={-1,0,1, 0}; //行方向 int dy[]={ 0,1,0,-1}; //列方向int m,n;
char g[25][25];int dfs(int x,int y)
{int res=1;g[x][y]='#'for(int i=0;i<4;i++) //遍历 四个方向的邻点 {int a=x+dx[i],b=y+dy[i];if(x<0&&x>=n&&y<0&&y>=m&&g[x][y]=='.')res+=dfs(a,b);} return res;
}
int main()
{ while(cin>>m>>n,n||m)  // m  列  n  行 {for(int i=0;i<n;i++) cin>>g[i]; //输入n行字符串int x,y;// @ 所在位置的坐标for(int i=0;i<n;i++)         // 寻找 @的所在位置 for(int j=0;j<m;j++)if(g[i][j]=='@'){x=i;y=j;} cout<<dfs(x,y)<<endl;        }return 0;
}

红与黑 ( Flood fill 算法 (针对网格题) )相关推荐

  1. 算法提高课学习——2.搜索——2.1.Flood Fill算法

    Flood Fill Flood Fill算法用于求图中的连通块数量,一般用BFS实现,不过也可以使用DFS来实现,更加简洁,但同时也可能会有爆栈的风险 对于图中的任意一个点,我们从该点出发标记它所有 ...

  2. Flood Fill算法总结

    最近一直跟着y总在刷蓝桥杯的课,借此我来对里面涉及到的Flood Fill算法做一个我目前接触到的所有的flood fill算法的总结 总 首先,这本质上是一个搜索算法.他的作用是对一个图(目前我用到 ...

  3. 洪水填充算法_洪水填充(Flood fill)算法

    洪水填充(Flood fill)算法 从一个起始节点开始把附近与其连通的节点提取出或填充成不同颜色颜色,直到封闭区域内的所有节点都被处理过为止,是从一个区域中提取若干个连通的点与其他相邻区域区分开(或 ...

  4. 常见算法之Flood Fill算法

    常见算法之Flood Fill算法 算法介绍 基本作用:寻找连通块 基本方法:BFS搜索 适用题目:需要找出分类块的题目/一些聚类问题 顾名思义,Flood Fill算法就是像洪水泛滥一样去寻找周围符 ...

  5. BFS 之Flood Fill 算法

    一个很重要的点:只有边权为1时才能应用BFS算法 习题篇:(12条消息) BFS 之Flood Fill 算法(二)_Dream.Luffy的博客-CSDN博客 算法介绍:  一如往常,我们先看看Fl ...

  6. flood fill算法

    flood fill算法实现有三种形式 1.depth first search 2.breadth first search 3.breadth first scan 基本思想是找到还没有分配com ...

  7. 算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs

    题目分析 来源:acwing 分析:这道题还是flood fill算法的应用,不同点在于八个方向扫描,习惯性采用二重循环来扫描周围的8个方向:其次,这里需要统计周围比它高的和比它矮的,这点用bool变 ...

  8. 算法提高课-搜索-Flood fill算法-AcWing 1097. 池塘计数:flood fill、bfs

    Flood fill 算法简介: 像洪水一样,一圈一圈往外蔓延,像bfs. flood fill 算法可以在线性复杂度内,找到某个点所在的连通块. 题目分析 来源:acwing ac代码 #inclu ...

  9. 算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs

    题目分析 来源:acwing 分析:找房间个数,也就是找连通的个数. 样例画出来的房间个数如下图:其中'|' 和'-'不是墙,只有#是墙. 分析:这题不用建图,直接bfs(flood fill)来做, ...

最新文章

  1. ASP.NET将Session保存到数据库中
  2. python神经网络风格_[Deep-Learning-with-Python]使用LSTM生成尼采风格文章
  3. Sandbox 文件存放规则
  4. Visual Studio下包含多项目的解决方案及项目间引用
  5. docker启动nginx,并挂载目录及docker容器中文乱码
  6. linux 构建 无线网络 过程
  7. 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
  8. 安全测试===sqlmap(零)转载
  9. JAVA redis 常用函数
  10. python的socket模块简单_Python使用socket模块实现简单tcp通信
  11. layui整合Echart
  12. win10右键没有新建选项,无法新建文件夹
  13. poi html转换成word文档,Apache POI将HTML转换成Word
  14. win7 x64部署和串口调试虚拟驱动toaster
  15. 华为实验-关于不同vlan之间的互通 混合实验
  16. 百思不得姐框架(二)
  17. 最新GEP分销系统网站源码官方
  18. MySQL - 03DDL之数据表
  19. d3dcompiler_47.dll缺失怎么修复?D3DCompiler_47.dll修复工具下载
  20. Hexo中添加音乐(列表)、视频的代码

热门文章

  1. 日语二级文法详解(完整版)
  2. 阿里云、腾讯云、百度云、京东云、华为云、盛大云、ucloud各自优势是?
  3. python常用单词下载_Python常用英语词汇
  4. Docker(三):Docker镜像加速器和常用命令
  5. Win8开始菜单方案第N+1种
  6. (JZ4245)2019.01.29【NOIP提高组】模拟B组 1.er(混沌与秩序)
  7. sangerbox制作heapmap_【魔兽WE教程】地图制作必须熟悉 的快捷键
  8. ASTERISK入门
  9. [软件工程基础]Alpha 阶段事后分析
  10. Nginx中配置开启Nginx Status来查看服务器运行状态