搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )

宝岛探险问题

问题描述:某片海域有诸多岛屿,用0表示海洋,1-9表示陆地,现给定一个岛屿上的坐标点,求解所在岛屿的面积

思路:显然这是一个搜索算法,即只要从当前坐标点开始遍历,每遍历到一个点进行计数即可,但是要注意sum的初始值为1!!!

Input:
10 10
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0
6 8

Output:
38

DFS

import java.util.Scanner;public class DFS {static int[][] a = new int[50][50];static int[][] book = new int[50][50];static int sum = 1;static int n, m;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {a[i][j] = input.nextInt();}}int startX = input.nextInt();int startY = input.nextInt();book[startX][startY] = 1;dfs(startX, startY);System.out.println(sum);}public static void dfs(int x, int y) {int[][] next = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int tx, ty;for (int i = 0; i < 4; i++) {tx = x + next[i][0];ty = y + next[i][1];if(tx < 0 || tx > n - 1 || ty < 0 || ty > n - 1) {continue;}if (a[tx][ty] > 0 && book[tx][ty] == 0) {sum ++;book[tx][ty] = 1;dfs(tx, ty);}}return;}
}

BFS

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;class node {int x;int y;node(int x, int y) {this.x = x;this.y = y;}
}
public class BFS {static int[][] a = new int[50][50];static int[][] book = new int[50][50];static int n, m;static int sum = 1;static Queue<node> queue = new LinkedList<>();static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {a[i][j] = input.nextInt();}}int startX = input.nextInt();int startY = input.nextInt();queue.offer(new node(startX, startY));book[startX][startY] = 1;bfs();System.out.println(sum);}public static void bfs() {int[][] next = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int tx, ty;while (!queue.isEmpty()) {for (int i = 0; i < 4; i++) {tx = queue.peek().x + next[i][0];ty = queue.peek().y + next[i][1];if (tx < 0 || tx > n - 1 || ty < 0 || ty > n - 1) {continue;}if(a[tx][ty] > 0 && book[tx][ty] == 0) {queue.offer(new node(tx, ty));sum++;book[tx][ty] = 1;}}queue.remove();}return;}
}

拓展:漫水填充法(FloodFill)
问题: 要求解区域中总共有多少岛屿??
思路:对每个点进深搜,对于每个大于0的点进行填充负值,负值每次-1,最后输出正的这个值,即是岛屿个数。
Input:
10 10
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0
Output:
输出

import java.util.Scanner;public class DFS {static int[][] a = new int[50][50];static int[][] book = new int[50][50];static int sum = 1;static int num = 0;static int n, m;static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();m = input.nextInt();for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {a[i][j] = input.nextInt();}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (a[i][j] > 0) {num--;book[i][j] = 1;dfs(i, j, num);}}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {System.out.print(a[i][j] + "\t");}System.out.println();}System.out.println(-num);}public static void dfs(int x, int y, int color) {int[][] next = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int tx, ty;a[x][y] = color;for (int i = 0; i < 4; i++) {tx = x + next[i][0];ty = y + next[i][1];if(tx < 0 || tx > n - 1 || ty < 0 || ty > n - 1) {continue;}if (a[tx][ty] > 0 && book[tx][ty] == 0) {sum ++;book[tx][ty] = 1;dfs(tx, ty, color);}}return;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7上修改MySQL数据库密码

一、通过命令行方式修改MySQL密码 1、方法一&#xff1a;用mysqladmin 格式&#xff1a;mysqladmin -u用户名 -p旧密码 password 新密码 实例&#xff1a;mysqladmin -uroot -pabc password 123456 2、方法二&#xff1a;用set password 首先&#xff0c;登录MySQL数据库。…

Python爬虫从入门到放弃(二十)之 Scrapy分布式原理

原文地址https://www.cnblogs.com/zhaof/p/7306374.html 关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构&#xff0c;只在本机维护一个爬取队列&#xff0c;Scheduler进行调度&#xff0c;而要实现多态服务器共同爬取数据关键就是共享爬取队列。 这里重…

python-入门

Python入门 阅读目录 一 编程与编程语言二 编程语言分类三 主流编程语言介绍四 python介绍五 安装python解释器六 第一个python程序七 变量八 用户与程序交互九 基本数据类型十 格式化输出十一 基本运算符十二 流程控制之if...else十三 流程控制之while循环十四 流程控制之for循…

图论算法(一)--最短路径的DFS/BFS解法(JAVA )

最短路径–城市路径问题&#xff1a; 问题描述&#xff1a;求从1号城市到5号城市的最短路径长度 Input&#xff1a; 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 4 3 4 4 4 5 5 5 3 3 Output&#xff1a; 9 DFS import java.util.Scanner; public class minPath {stati…

win7安装composer

一、下载安装包 二、安装 1、双击安装包进行安装 2、安装选项&#xff0c;点击next 3、选择php.exe的路径 4、选择并next 5、代理 6、准备安装 7、信息 8、安装成功 9、测试是否安装成功 10、安装位置 11、密钥位置 12、添加路径到环境变量 13、配置国内镜…

图论算法(二)-最短路径的Dijkstra [ 单源 ] 和Floyd[ 多源 ] 解法(JAVA )

一、Dijkstra算法 问题描述&#xff1a;求一个点到任意个点的距离 思路&#xff1a;单源最短路径问题&#xff0c;使用Dijkstra算法 Input&#xff1a; 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 3 4 4 5 13 4 6 15 5 6 4 Output&#xff1a; 0 1 8 4 13 17 imp…

MySQL日志分析

一、MySQL日志简介 &#xff08;一&#xff09;、mysql日志的种类&#xff0c;一般来说&#xff0c;日志有五种&#xff0c;分别为&#xff1a; 错误日志&#xff1a;log_error (记录启动&#xff0c;运行&#xff0c;停止mysql时出现的信息)二进制日志&#xff1a;log_bin &…

图论算法(三)--最短路径 的Bellman-Flod [ 带负权值图 ] 的解法(JAVA )

Bellman-Flod算法 对于带有负权值的图&#xff0c;我们已经不能通过Dijkstra算法进行求解了 原因&#xff1a;Dijkstra每次都会找一个距源点&#xff08;设为s&#xff09;最近的点&#xff0c;然后将该距离定为这个点到源点的最短路径&#xff1b;如果一个顶点u被加入了book…

SpringCloud介绍(一)

1.1 SpringCloud介绍 1.1.1 微服务架构演化 简而言之&#xff0c;微服务就是开发一组小型服务的方式来开发一个独立的应用系统&#xff0c;每个小型服务都运行在自己的进程中&#xff0c;并采用HTTP资源API轻量级的机制来互相通信。这些服务围绕业务功能进行构建&…

最短路径问题总结,时间复杂度,空间复杂度对比(JAVA)

最短路径问题总结 图中还有些地方没有完善&#xff0c;但是一时也没没办法解决&#xff0c;希望大家知道的能够提供一下表中不足的地方&#xff0c;万分感谢&#xff01;&#xff01;&#xff01; 最短路径算法&#xff08;一&#xff09;–DFS/BFS求解&#xff08;JAVA &…

树--树的基本性质(JAVA)

前几篇文章介绍了图的搜索算法&#xff0c;最短路径算法&#xff0c;接下来介绍树&#xff1a; 树和图 树实际上就是不含回路的无向连通图 虽然树不连通&#xff0c;没有回路了&#xff0c;但是这也使得树这种数据结构有了更多的特性&#xff1a; 1.一棵树中的任意两个结点…

看后端程序员调试CORS的姿势

# 目录 为什么有同源策略&#xff1f; 需要解决的问题CORS跨域请求方案 preflightwithCredentials附&#xff1a;高效、优雅地调试CORS实现为什么有同源策略&#xff1f; 同源策略Same Origin Policy 是一种约定&#xff0c;是浏览器最核心的安全功能&#xff1a;该策略允许在…

图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)

之前我们介绍了求最短路径算法&#xff0c;现在又讲最小生成树算法&#xff0c;这两个算法有什么区别呢&#xff1f; 首先要明确&#xff0c;最短路径和最小生成树是两个不同的概念。 最短路径是对于一个图的两个结点而言的。在一个图中&#xff0c;结点A通过某些结点和边可以…

express+handlebars 快速搭建网站前后台

最近在重构公司网站&#xff0c;原来网站使用PHP&#xff0c;前后端不分离&#xff0c;添加与更新网站内容仍使用原始方法&#xff0c;先出布局再把调好的布局给PHP后端开发&#xff0c;花时间长&#xff0c;维护不易。因此决定将网站前后端分离&#xff0c;核心功能含网站下单…

定义一个二维数组并输入数据,将二维数组元素的值按升序排列,并输出排序后的二维数组。

目录 问题&#xff1a; 回顾&#xff1a; 给出两种做法&#xff1a; 解法一&#xff1a;调用qsort 函数进行排序 代码&#xff1a; 运行结果&#xff1a; 解法二&#xff1a;冒泡排序 代码&#xff1a; 运行结果: 回顾里的4种方法的模板参考&#xff1a; 1.冒泡排序…

第五届省赛(软件类)真题----Java大学C组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学C组答案及解析 杨辉三角调和级数回文素数过大年位平方和单位分数n级台阶 一、杨辉三角 二项式的系数规律&#xff0c;我国数学家很早就发现了。 如【图1.png】&#xff0c;我国南宋数学家杨辉1261年所著的《详解九…

Angular4.x 安装|创建项目|目录结构|创建组件

Angular4.x 安装|创建项目|目录结构|创建组件 安装最新版本的 nodejs node.js 官网&#xff1a;https://nodejs.org/zh-cn/ 去官网下载 node.js&#xff0c;下一步下一步就可以了。只要 node.js 安装成功&#xff0c;那么 npm 也会帮你安装完成&#xff01; 注意&#xff1a;请…

第五届省赛(软件类)真题----Java大学B组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学B组答案及解析 正则切分调和级数n的n次幂七对数字勾股定理九阶数独G将军 一、正则切分 java中提供了对正则表达式的支持。 有的时候&#xff0c;恰当地使用正则&#xff0c;可以让我们的工作事半功倍&#xff01; …

第五届省赛(软件类)真题----Java大学A组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学A组答案及解析 子序列最大长度莱布尼茨公式n的n次幂七对数字勾股定理九阶数独矩阵射线 一、子序列最大长度 一个串的子串是指该串的一个连续的局部。如果不要求连续&#xff0c;则可称为它的子序列。 比如对串&…

第六届省赛(软件类)真题----Java大学C组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子 一、隔行变色 Excel表的格子很多&#xff0c;为了避免把某行的数据和相邻行混淆&#xff0c;可以采用隔行变色的…