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

代码随想录算法训练营四十四天|图论part02

岛屿问题(一)岛屿数量:深搜版

题目描述:

给定一个由 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

代码如下:

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

岛屿问题(二)岛屿数量:广搜版

代码如下:

import java.util.*;public class Main{public static void main(String[] args){Scanner in=new Scanner(System.in);int n=in.nextInt();int m=in.nextInt();int[][] graph=new int[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){graph[i][j]=in.nextInt();}}int ans=0;boolean[][] visited=new boolean[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(visited[i][j]==false&&graph[i][j]==1){ans++;bfs(graph,visited,i,j);}}}System.out.println(ans);}private static final int[][] dir={{0,1},{1,0},{-1,0},{0,-1}};public static void bfs(int[][] graph,boolean[][] visited,int x,int y){Queue<int[]> q=new LinkedList<>();q.offer(new int[]{x,y});visited[x][y]=true;while(!q.isEmpty()){int[] cur=q.poll();int curx=cur[0];int cury=cur[1];for(int i=0;i<4;i++){int nextx=curx+dir[i][0];int nexty=cury+dir[i][1];if(nextx<0||nexty<0||nextx>=graph.length||nexty>=graph[0].length)continue;if(visited[nextx][nexty]==false&&graph[nextx][nexty]==1){visited[nextx][nexty]=true;q.offer(new int[]{nextx,nexty});}}}}
}

岛屿问题(三)岛屿的最大面积

题目描述

给定一个由 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

输出示例

4

提示信息

样例输入中,岛屿的最大面积为 4。

数据范围:

1 <= M, N <= 50。

代码如下(深搜版):

import java.util.*;public class Main {private static int Max = 0;private static int ans=0;public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int[][] graph = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {graph[i][j] = in.nextInt();}}boolean[][] visited = new boolean[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (visited[i][j] == false && graph[i][j] == 1) {ans=1;visited[i][j] = true;dfs(graph, visited, i, j);Max=Math.max(Max,ans);}}}System.out.println(Max);}private static final int[][] dir = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};public static void dfs(int[][] graph, boolean[][] visited, int x, int y) {for (int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nexty < 0 || nextx >= graph.length || nexty >= graph[0].length)continue;if (visited[nextx][nexty] == false && graph[nextx][nexty] == 1) {visited[nextx][nexty] = true;ans++;dfs(graph, visited, nextx, nexty);}}}
}

广搜版:

import java.util.*;public class Main{private static int ans=0;private static int Max=0;public static void main(String[] args){Scanner in=new Scanner(System.in);int n=in.nextInt();int m=in.nextInt();int[][] graph=new int[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){graph[i][j]=in.nextInt();}}boolean[][] visited=new boolean[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(visited[i][j]==false&&graph[i][j]==1){ans=1;bfs(graph,visited,i,j);Max=Math.max(Max,ans);}}}System.out.println(Max);}private static final int[][] dir={{0,1},{1,0},{-1,0},{0,-1}};public static void bfs(int[][] graph,boolean[][] visited,int x,int y){Queue<int[]> q=new LinkedList<>();q.offer(new int[]{x,y});visited[x][y]=true;while(!q.isEmpty()){int[] cur=q.poll();int curx=cur[0];int cury=cur[1];for(int i=0;i<4;i++){int nextx=curx+dir[i][0];int nexty=cury+dir[i][1];if(nextx<0||nexty<0||nextx>=graph.length||nexty>=graph[0].length)continue;if(visited[nextx][nexty]==false&&graph[nextx][nexty]==1){ans++;visited[nextx][nexty]=true;q.offer(new int[]{nextx,nexty});}}}} 
}

没什么好说的,都是模板题。

http://www.lryc.cn/news/623471.html

相关文章:

  • 天地图开发的优点
  • The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络
  • GANs生成对抗网络生成手写数字的Pytorch实现
  • VS Code配置MinGW64编译Apache Arrow C++库
  • 【k8s、docker】Headless Service(无头服务)
  • python+flask后端开发~项目实战 | 博客问答项目--模块化文件架构的基础搭建
  • C++算法题目分享:二叉搜索树相关的习题
  • 【前端基础】flex布局中使用`justify-content`后,最后一行的布局问题
  • ubuntu 24.04 安装
  • Android RxJava线程调度与性能优化指南
  • (一)前端面试(cookie/)
  • PostgreSQL导入mimic4
  • 数据结构代码分享-1 顺序表
  • 简单的 VSCode 设置
  • Oracle algorithm的含义
  • 基于Vue + Node能源采购系统的设计与实现/基于express的能源管理系统#node.js
  • Qt 5.5 的安装与配置(使用 VSCode编辑)
  • 【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第十二节:网关安全-信息过滤
  • 基于多Agent的AFSIM复杂场景脚本生成技术(使用Claude Code)
  • 根号算法Ⅰ
  • 天地图应用篇: 增加缩放、比例尺控件
  • 24. 什么是不可变对象,好处是什么
  • 【Docker】搭建一款功能强大且免费的开源在线绘图工具 - draw.io
  • 云原生俱乐部-RH134知识点总结(2)
  • 62.不同路径
  • 【计算机网络面试】键入网址到网页显示期间,发生了什么?
  • 网络常识-DNS如何解析
  • 数据结构初阶(19)外排序·文件归并排序的实现
  • Ugit使用记录
  • 【自动化运维神器Ansible】template流程控制:for循环与if条件判断详解