1113 红与黑(Flood Fill算法,用DFS或BFS求解)

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

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

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

输入格式
输入包括多个数据集合。

每个数据集合的第一行是两个整数 WWW 和 HHH,分别表示 xxx 方向和 yyy 方向瓷砖的数量。

在接下来的 HHH 行中,每行包括 WWW 个字符。每个字符表示一块瓷砖的颜色,规则如下

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

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

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

数据范围
1≤W,H≤201≤W,H≤201≤W,H≤20
输入样例:
6 9
…#. .
…#. .
… …
… …
… …
… …
… …
#@…#
.#…#.
0 0
输出样例:
45

Flood Fill算法一般都可以用BFS和DFS实现。

BFS伪代码如下
while 队列非空{取出队列的头 t枚举t的四个邻格if(格子是陆地,且还未被灌溉){标记为已被灌溉插入到队列尾部}
}

这道题有一个比较坑的地方就是第一个数表示的是列,第二个数才表示的是行
还有一个需要注意的地方就是因为这道题是连续的输入输出,即题中所说的包含多个数据集合,所以标记数组每次都需要初始化
思路:
首先先读入数据(注意第一个数表示列,第二个数才表示行),在读入的同时记录下站着的黑色瓷砖的位置
然后就是宽搜的模板
以这个站着的黑色瓷砖为中心,向四个方向进行扩散,如果扩散到的位置没有越界,并且是黑色瓷砖,并且之前没有遍历过,就把这个瓷砖加入到队列中(等待着之后以这个瓷砖为中心扩散)同时对这个瓷砖进行标记,表示这个瓷砖已经被遍历过。

import java.io.BufferedInputStream;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(new BufferedInputStream(System.in));while(scanner.hasNext()){ //由于有多组数据,所以用一个while循环(示例中只给了一组数据而已)int m = scanner.nextInt();//题目中是先输入的列,我们习惯用m代表列int n = scanner.nextInt();//输入的是两个0代表本组数据结束,应该去读取下一组数据了,即重新去进while循环if(m == 0 && n == 0) break;char[][] arr = new char[n][m];boolean[][] isVisited = new boolean[n][m];//标记数组,用于标记该格子是否访问过int x = 0 ,y = 0;for(int i = 0;i < n;i++){char[] chs = scanner.next().toCharArray();//chs的长度就是mfor(int j = 0;j < m;j++){arr[i][j] = chs[j];if(arr[i][j] == '@'){//起点位置x = i;y = j;}}}System.out.println(bfs(x,y,arr,isVisited));}}public static int bfs(int x,int y,char[][] arr,boolean[][] isVisited){Queue<Node> queue = new LinkedList<>();//Queue是接口,LinkedList是其一个实现类queue.add(new Node(x,y));//将第一个格子加入队列isVisited[x][y] = true;int res = 1;//起点本身也算一个可到达的格子,故res初始值是1int[] dx = {-1,0,1,0};//上右下左int[] dy = {0,1,0,-1};while(!queue.isEmpty()){Node node = queue.poll();for(int i = 0;i < 4;i++){int a = node.x + dx[i];//下一个要被访问的格子的坐标int b = node.y + dy[i];//下一个要访问的格子没有越界且没有被访问过才进行后续的操作if(a >= 0 && a < isVisited.length && b >= 0 && b < isVisited[0].length && !isVisited[a][b] ){//如果是'.'表示可以访问,将该坐标加入队列尾,并标记该格子已访问,计数加1if(arr[a][b] == '.'){queue.add(new Node(a,b));isVisited[a][b] = true;res += 1;}}}}return res;}
}//代表坐标的类,用于宽搜时将坐标存入队列
class Node{public int x;public int y;Node(int x,int y){this.x = x;this.y = y;}
}

DFS

import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(new BufferedInputStream(System.in));while(scanner.hasNext()){int m = scanner.nextInt();int n = scanner.nextInt();if(m == 0 && n == 0) break;char[][] arr = new char[n][m];boolean[][] isVisited = new boolean[n][m];int x = 0,y = 0;for(int i = 0 ;i < n ;i++){char[] chs = scanner.next().toCharArray();for(int j = 0;j < m;j++){arr[i][j] = chs[j];if(arr[i][j] == '@'){x = i;y = j;}}}System.out.println(dfs(x,y,arr,isVisited));}}private static int dfs(int x, int y, char[][] arr, boolean[][] isVisited) {isVisited[x][y] =  true;int res = 1;int[] dx = {-1,0,1,0};//上右下左int[] dy = {0,1,0,-1};for(int i = 0;i < 4;i++){int a = x + dx[i];int b = y + dy[i];if(a >= 0 && a < arr.length && b >= 0 && b < arr[0].length && !isVisited[a][b]){if(arr[a][b] == '.'){res += dfs(a,b,arr,isVisited);//让结果加上从a,b作为起点出发可以到达的所有格子数}}}return res;}
}

day04 1113 红与黑(flood fill算法,即DFS,BFS)相关推荐

  1. 红与黑 ( Flood fill 算法 (针对网格题) )

    题目描述 有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖. 你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动. 请写一个程序,计算你总共能够到达多少块黑色的瓷砖. ...

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

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

  3. Flood Fill算法总结

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

  4. flood fill算法

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

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

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

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

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

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

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

  8. 常见算法之Flood Fill算法

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

  9. BFS 之Flood Fill 算法

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

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

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

最新文章

  1. 限免!百名AI大咖,20大技术和行业论坛,不可错过的开发者嘉年华
  2. JavaScript:事件冒泡和事件委托
  3. leetcode 106. 从中序与后序遍历序列构造二叉树 c语言递归解法
  4. python爬取js加载的数据_Python爬虫学习,记一次抓包获取js,从js函数中取数据的过程...
  5. Andrew Ng机器学习课程14(补)
  6. 【算法】划分数 动态规划
  7. 思科携手中兴掌握3G话语权 剑指华为3COM组合
  8. linux下qt生成可安装的程序,linux – 如何为Qt应用程序创建“安装”包?
  9. python 类可以调用实例变量_python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
  10. linux gcc编译只能编译一条,请教一个gcc编译器的问题啊
  11. Vue深入学习1—mustache模板引擎原理
  12. 【Flink】Flink 源码阅读笔记(20)- Flink 基于 Mailbox 的线程模型
  13. python3.3 urllib.error.HTTPError: HTTP Error 403: Forbidden
  14. 电源硬件设计----开关电源布局设计要领
  15. html表格中加背景图片,html设置表格背景图片.doc
  16. 生物信息_odds_ratios、Likelihood_Ratios、发病率、frequency
  17. 公司流程 企业所得税 个人所得税
  18. 那些打印对称图形的题
  19. 计算机进程同步实验观察结果记录表,实验5 操作系统进程与文件管理 实验报告表 作业 5.doc...
  20. 小学生终究干不过富婆?《王者荣耀》返场皮肤厨娘夺冠,猴子落榜

热门文章

  1. 向爷爷介绍计算机,他折腾爷爷的计算机
  2. 无线网络有信号显示未连接网络连接服务器,路由器无线网络受限制或无连接怎么办...
  3. 保护眼睛颜色的RGB数值
  4. office_professional_plus_2010安装
  5. Django实现邮箱激活
  6. H5移动端页面设计的基础规范
  7. WordPress-Tony极简免费单栏博客主题
  8. 2019 360校招笔试- 编程题 -2018.08.27
  9. MATLAB中的三次样条插值spline函数
  10. 还记得JavaWeb中的组件Servlet吗?面试会问