当前位置: 首页 > news >正文

岛屿数量---DFS BFS

以下内容是从网站中学习的如果有错误欢迎批评指正~~~~

题目描述:

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

输入描述:

第一行包含两个整数 N, M,表示矩阵的行数和列数。

后续 N 行,每行包含 M 个数字,数字为 1 或者 0。

输出描述:

输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。

输入示例:

4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

输出示例:

3

提示信息

根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。

数据范围:

  • 1 <= N, M <= 50

思路

注意题目中每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

也就是说斜角度链接是不算了。

这道题题目是 DFS,BFS,并查集,基础题目。

本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。

在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。

那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。

DFS代码:

import java.util.Scanner;public class DFS {public static int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}};public static void dfs(boolean[][] visited,int x,int y,int [][] grid){for(int i = 0;i < 4;i ++){int nextx = x + dir[i][0];int nexty = y + dir[i][1];if(nextY<0||nextX<0||nextX>= grid.length||nextY>=grid[0].length)continue;if(!visited[nextX][nextY]&&grid[nextX][nextY]==1){visited[nextX][nextY]=true;dfs(visited,nextX,nextY,grid);}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nexInt();int n = sc.nextInt();int [][] grid = new int[m][n];for(int i= 0; i < m; i++){for(int j = 0; j < n; j++){grid[i][j] = sc.nextInt();}}boolean[][] visited = new boolean[m][n];int ans = 0;for(int i = 0;i < m;i ++){for(int j = 0;j < n;j ++){if(!visited[i][j] && grid[i][j] == 1){ans++;visited[i][j] = true;dfs(visited,i,j,grid);}}}System.out.println(ans);}
}

BFS代码:

根本原因是只要 加入队列就代表 走过,就需要标记,而不是从队列拿出来的时候再去标记走过

很多同学可能感觉这有区别吗?

如果从队列拿出节点,再去标记这个节点走过,会导致很多节点重复加入队列。

import java.util.*;public class BFS {public static int [][] dir = {{0,1},{0,-1},{1,0},{-1,0}};public static void bfs(int [][] grid,boolean [][] visited,int x,int y){Queue<pair> queue = new LinkedList<pair>();//定义坐标队列,没有现成的pair类,在下面定义一个pair类queue.add(new pair(x,y));visited[x][y] = true;//遇到入队直接标记为优先//否则出队时才标记的话会导致重复访问,比如下方节点会在右下顺序的时候被第二次访问入队while(!queue.isEmpty()){int curX = queue.peek().first;int curY = queue.poll().second;//当前横纵坐标for(int i = 0;i < 4;i ++){//顺时针遍历新节点next,下面记录坐标int nextX = curX + dir[i][0];int nextY = curY + dir[i][1];if(nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length){continue;}//去除越界部分if(!visited[nextX][nextY] && grid[nextX][nextY] == 1){queue.add(new pair(nextX,nextY));visited[nextX][nextY] = true;   //逻辑同上}}}}public static void main(String [] args){Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();int [][] grid = new int[m][n];int ans = 0;for(int i = 0;i < m;i ++){for(int j = 0;j < n;j ++){grid[i][j] = sc.nextInt();}}for(int i = 0;i < m;i ++){for(int j = 0;j < n;j ++){if(!visited[i][j] && grid[i][j] == 1){ans++;bfs(grid,visited,i,j);}}}System.out.println(ans);}static class pair {int first;int second;pair(int first, int second) {this.first = first;this.second = second;}}}

http://www.dtcms.com/a/551160.html

相关文章:

  • wordpress二级域名建站微信分销商城平台系统
  • 文化传媒可以做网站吗手机创建网站
  • 商丘河南网站建设中山小榄网站
  • 软件班级网站建设主题做网站服务器配置
  • 2024icpc上海区域赛(ICBG)
  • 网站后台上传用户界面不显示wordpress ajax 慢
  • 医疗网站建设中心如何自己开发一个软件
  • 萧山建设银行招聘网站北京哪些做网站的公司好
  • 咸阳机场建设招聘信息网站im聊天软件开发
  • 宁波网站建设优化企业wordpress ip
  • wordpress皮肤设置企业网站如何优化
  • 广元网站建设广元erp系统的优点
  • 乾县做网站罗湖区住房和建设局网站
  • 免费网站建站排行榜app制作软件教程
  • 网站编辑制作广州自助网站推广制作
  • 【企业SRE/DevOps向的精通Linux课程培训课程】第 19 天:Linux 存储和文件系统(ext4, xfs, btrfs, 配额, 调优)
  • 做网站和网页区别迪奥网页设计图片
  • 英语课件做的好的网站vc做网站
  • 河北建设行业信息网站兰州建设网站
  • 10分钟免费建网站北京新鸿儒做的网站
  • 做瞹瞹小视频网站做服装搭配的流行趋势网站
  • 苏州建设网站公司在什么地方考研哪个培训机构比较好
  • Linux系统调用lseek详解:文件指针的灵活控制
  • 郑州seo建站如何做一个网络营销
  • html跳转到另一个html页面公司搜索seo
  • 商城网站需要多少空间网站建设 会议主持稿
  • 五合一小程序网站外管局网站做延期收汇报告
  • 慈溪网站建设网站优化就是seo
  • 网站开发毕业设计文档太原做推广营销
  • 搭建个人视频网站微信程序开发平台