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

探讨Java深搜算法的学习笔记

大家好,我是 V 哥。深度优先搜索(DFS)是一种图遍历算法,它优先深入到某条路径的尽头,再回溯到前一个节点继续探索其他路径,直到找到目标或遍历完整个图。DFS的应用场景广泛,可以用于路径搜索、连通性判断、迷宫求解等。以下是一个典型的DFS实现示例以及分析它在不同业务场景中的应用。

V 哥推荐:2024 最适合入门的 JAVA 课程

1. 先来看一个案例

以下为一个Java实现的DFS算法示例,用于在一个二维矩阵中寻找从起点到终点的路径。该矩阵中1表示可以通过的点,0表示障碍物。目标是找到从起点(0,0)到终点(m-1,n-1)的路径。

public class DFSMazeSolver {private static final int[] DX = {-1, 1, 0, 0}; // 行移动方向:上,下private static final int[] DY = {0, 0, -1, 1}; // 列移动方向:左,右public boolean dfs(int[][] maze, int x, int y, boolean[][] visited) {int rows = maze.length;int cols = maze[0].length;// 边界条件与目标判断if (x < 0 || y < 0 || x >= rows || y >= cols || maze[x][y] == 0 || visited[x][y]) {return false;}// 到达终点if (x == rows - 1 && y == cols - 1) {return true;}// 标记当前位置已访问visited[x][y] = true;// 递归地探索四个方向for (int i = 0; i < 4; i++) {int newX = x + DX[i];int newY = y + DY[i];if (dfs(maze, newX, newY, visited)) {return true;}}// 回溯visited[x][y] = false;return false;}public boolean canSolveMaze(int[][] maze) {int rows = maze.length;int cols = maze[0].length;boolean[][] visited = new boolean[rows][cols];return dfs(maze, 0, 0, visited);}public static void main(String[] args) {int[][] maze = {{1, 0, 0, 0},{1, 1, 0, 1},{0, 1, 0, 0},{1, 1, 1, 1}};DFSMazeSolver solver = new DFSMazeSolver();if (solver.canSolveMaze(maze)) {System.out.println("路径可达");} else {System.out.println("无可行路径");}}
}

代码说明

  1. DFS主逻辑dfs方法用于在当前位置(xy)开始深度优先搜索。
  2. 边界条件:包括是否越界、是否遇到障碍物以及是否已经访问。
  3. 终点判断:当到达矩阵右下角终点(rows-1cols-1)时,返回true
  4. 回溯处理:在搜索过程中,为了避免重复访问,将访问过的位置标记为已访问,若搜索失败则回溯重置。

2. 业务场景分析

  1. 迷宫或地图导航:DFS可用于迷宫或地图路径导航,寻找从起点到终点的路径。在实际应用中,可以在机器人路径规划、无人机飞行路径规划中使用类似的DFS算法。

  2. 权限和连通性检测:在网络安全中,DFS可以用于检测用户权限或系统连通性,例如检测某用户在权限网络中的访问路径,确保系统关键资源安全。

  3. 社交网络分析:在社交网络中,DFS可以用于分析用户关系连通性,例如寻找两个人之间的关系链路、推荐相似好友。

  4. 数据爬取:DFS算法也可用于数据爬取,从起始页面开始深度爬取相关页面信息。

在机器人路径规划和无人机飞行路径规划中,DFS算法可以用来寻找从起点到目标点的可行路径。DFS适合在地图较小且需要找到任意一条可行路径的场景。以下是一个在网格地图上实现DFS的完整Java代码示例,模拟机器人或无人机在二维平面上寻找从起点到目标点的路径。

如何实现无人机飞行路径规划

假设网格中的0表示障碍物,1表示可通行区域。目标是从起点(0, 0)到终点(m-1, n-1)找到一条通路。

import java.util.ArrayList;
import java.util.List;public class RobotPathPlanner {// 定义四个方向:上,下,左,右private static final int[] DX = {-1, 1, 0, 0};private static final int[] DY = {0, 0, -1, 1};private static final String[] DIRECTION = {"Up", "Down", "Left", "Right"};// 存储路径private List<String> path = new ArrayList<>();// 深度优先搜索算法public boolean dfs(int[][] grid, int x, int y, boolean[][] visited) {int rows = grid.length;int cols = grid[0].length;// 边界条件:检查是否越界,是否遇到障碍物,是否已访问if (x < 0 || y < 0 || x >= rows || y >= cols || grid[x][y] == 0 || visited[x][y]) {return false;}// 如果到达终点位置,路径规划成功if (x == rows - 1 && y == cols - 1) {path.add("(" + x + "," + y + ")");return true;}// 标记当前节点为已访问visited[x][y] = true;path.add("(" + x + "," + y + ")");// 遍历四个方向进行递归搜索for (int i = 0; i < 4; i++) {int newX = x + DX[i];int newY = y + DY[i];if (dfs(grid, newX, newY, visited)) {path.add(DIRECTION[i]);return true;}}// 回溯:撤销当前路径点的访问path.remove(path.size() - 1);visited[x][y] = false;return false;}public List<String> findPath(int[][] grid) {int rows = grid.length;int cols = grid[0].length;boolean[][] visited = new boolean[rows][cols];if (dfs(grid, 0, 0, visited)) {return path;} else {path.add("No Path Found");return path;}}public static void main(String[] args) {int[][] grid = {{1, 0, 0, 0},{1, 1, 0, 1},{0, 1, 1, 0},{1, 0, 1, 1}};RobotPathPlanner planner = new RobotPathPlanner();List<String> path = planner.findPath(grid);System.out.println("规划路径:");for (String step : path) {System.out.println(step);}}
}

来解释一下代码

  1. 方向定义DXDY分别代表在网格上移动的方向数组,DIRECTION数组用于记录方向名称,便于输出路径。
  2. DFS递归搜索dfs方法从指定位置(x, y)开始搜索,检查越界、障碍物和访问状态。
  3. 终点判断:到达终点时返回true,并将路径记录到path列表。
  4. 回溯:如果当前路径无效,则回溯并撤销该路径点的访问状态。
  5. 路径输出:主函数findPath调用dfs,并根据DFS结果返回路径或“未找到路径”的提示。

机器人路径规划:在仓储物流中,机器人需要规划从起点到指定位置的路径,避开障碍物(如货架),通过DFS可以找到一条可行的路径。

无人机飞行路径规划:在室内或复杂地形中,无人机可以通过DFS找到安全飞行路线,避开障碍物,确保抵达目的地。DFS适用于场地相对较小且只需找到一条路径的场景。

3. 最后的注意事项

  1. 性能:在较大区域或复杂地形中,DFS可能导致大量回溯。可以用A*或Dijkstra等启发式算法优化。
  2. 障碍动态性:如果障碍物可能移动,可以定期重新规划路径。

关注威哥爱编程,编码路上V哥陪你不寂寞。

相关文章:

探讨Java深搜算法的学习笔记

大家好&#xff0c;我是 V 哥。深度优先搜索&#xff08;DFS&#xff09;是一种图遍历算法&#xff0c;它优先深入到某条路径的尽头&#xff0c;再回溯到前一个节点继续探索其他路径&#xff0c;直到找到目标或遍历完整个图。DFS的应用场景广泛&#xff0c;可以用于路径搜索、连…...

408——操作系统(持续更新)

文章目录 一、操作系统的概念及特征1.1 计算机系统的概念1.2 操作系统的基本特征 二、操作系统的功能和接口2.1 操作系统作为计算机资源的管理者2.2 操作系统作为用户和计算机硬件系统之间的接口2.3 操作系统实现对计算机资源的扩充 三、操作系统的发展和分类四、操作系统的运行…...

架构师之路-学渣到学霸历程-37

Nginx的热部署实验 本次分享的就是nginx的升级以及降级&#xff0c;实验中其实很多操作都需要理解&#xff0c;实际操作不难&#xff0c;但是需要全面理解这个动作&#xff0c;敲这个命令是用来干什么的&#xff1f;借着这个笔记可以试一下&#xff1b;go~&#xff01; 1、ng…...

CSRF与SSRF

csrf(跨站请求伪造)的原理: csrf全称是跨站请求伪造(cross-site request forgery)&#xff0c;也被称为one-click attack 或者 session riding scrf攻击利用网站对于用户网页浏览器的信任&#xff0c;劫持用户当前已登录的web应用程序&#xff0c;去执行分用户本意的操作。 利…...

RabbitMQ 存储机制

一、消息存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘&#xff0c;非持久化的消息一般只保存在内存中&#xff0c;在内存吃紧的时候会被换入到磁盘中&#xff0c;以节省内存空间。这两种类型的消息的落盘处理都…...

【Java SE】类型转换

类型转换是将一个值从一种类型转换为另一种类型的过程。该过程如果从低精度数据类型转为高精度数据类型&#xff0c;则不会发生溢出并且总能成功&#xff0c;如果从高精度数据类型转为低精度数据类型&#xff0c;则会有信息丢失且可能失败。类型转换又可分为隐式转换和显式转换…...

JAVA:常见 JSON 库的技术详解

1、简述 在现代应用开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象&#xff0c;常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…...

Redis缓存击穿、雪崩、穿透解决方案

Redis 缓存击穿、雪崩、穿透解决方案 1、首先看看逻辑方面是否还有优化空间&#xff0c;正常流程查询redis中获取不到数据&#xff0c;则去数据库获取&#xff0c;但数据库查询并返回时&#xff0c;调用异步方法&#xff0c;将该数据存储进redis中&#xff0c;并设置一个较短的…...

C++ 优先算法——盛最多水的容器(双指针)

目录 题目&#xff1a;盛最多水的容器 1. 题目解析 2. 算法原理 3. 代码实现 题目&#xff1a;盛最多水的容器 1. 题目解析 题目截图: 如图所示&#xff1a; 水的高度一定是由较低的那条线的高度决定的&#xff1a;例1图中&#xff0c;是由7决定的&#xff0c;然后求出…...

blender 小车建模 建模 学习笔记

一、学习blender视频教程链接 案例4&#xff1a;狂奔的小车_建模_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Bt4y1E7qn?p14&spm_id_from333.788.videopod.episodes&vd_sourced0ea58f1127eed138a4ba5421c577eb1 二、开始建模 &#xff08;1&#xff09;创…...

导出列表数据到Excel并下载

Java导出查询到的数据列表为Excel并下载 1.背景 工作中经常有需求&#xff0c;需要把列表的数据导出为Excel并下载。EasyExcel工具可以很好的实现这一需求。 2.实现流程 1.引入EasyExcel依赖包 <dependency><groupId>com.alibaba</groupId><artifactId…...

基于NVIDIA NIM平台实现盲人过马路的demo(一)

前言:利用NVIDIA NIM平台提供的大模型进行编辑,通过llama-3.2-90b-vision-instruct模型进行初步的图片检测 step1: 部署大模型到本地,引用所需要的库 import os import requests import base64 import cv2 import time from datetime import datetimestep2: 观看官方使用文…...

美格智能5G车规级通信模组:以连接+算力驱动智能化进阶

2023年3月&#xff0c;基于高通公司第二代骁龙汽车5G调制解调器及射频系统平台SA522M/SA525M&#xff0c;美格智能在德国纽伦堡嵌入式系统展上正式发布全新一代5G车规级C-V2X通信模组MA922系列&#xff0c;迅速引起行业和市场关注。随着5G高速网联逐步成为智能汽车标配&#xf…...

[MRCTF2020]PYWebsite1

如果输入的密钥是对的那么我们就直接跳转到flag.php页面 那么我们直接访问&#x1f60e;&#xff0c;他不带我们去我们自己去. 那就用XFF呗. 知识点&#xff1a; 定义&#xff1a;X-Forwarded-For是一个HTTP请求头字段&#xff0c;用于识别通过HTTP代理或负载均衡方式连接到W…...

无源元器件-磁珠选型参数总结

🏡《总目录》 目录 1,概述2,磁珠选型参数2.1,电学参数2.1.3,阻抗(Impedance)2.1.2,额定电流(Rated Current)2.1.3,直流电阻(DC Resistance)2.2,机械性能参数2.2.1,外观和尺寸(Appearance and Dimensions)2.2.2,粘接强度( Bonding Strength)2.2.3,弯曲强度…...

宝顶白芽,慢生活的味觉盛宴

在快节奏的生活中&#xff0c;人们愈发向往那种悠然自得、返璞归真的生活方式。白茶&#xff0c;以其独特的韵味和清雅的风格&#xff0c;成为了现代人追求心灵宁静与生活品质的象征。而在众多白茶之中&#xff0c;竹叶青茶业出品的宝顶白芽以其甘甜醇爽的特质&#xff0c;成为…...

已知三角形三边长求面积用仓颉语言作答

仓颉语言 https://cangjie-lang.cn/ linux和win和mac均有sdk&#xff0c;在本机deepinlinuxv23下载到本地解压缩到目录下设置环境变量 source envsetup.sh 比java方便太多了&#xff0c;java每次都是要自己搞很久&#xff0c;当然&#xff0c;打开看一下envsertup.sh,和我们…...

【JavaScript】匿名函数及回调函数总结

JavaScript 匿名函数 匿名函数没有显式的名称, 被视为一个函数表达式&#xff0c;可以在不需要额外命名的情况下进行定义和使用, 通常被用作回调函数, 即将函数作为参数传递给其他函数。 回调函数是在特定事件或条件发生时被调用的函数&#xff0c;回调函数通常用于异步编程中…...

HTML鼠标移动的波浪线动画——页面将会初始化一个Canvas元素,并使用JavaScript代码在Canvas上绘制响应鼠标移动的波浪线动画

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Wave Animation</title><style&…...

树莓派开发相关知识八-其他传感器

1、蜂鸣器 #!/usr/bin/env python #coding:utf-8import RPi.GPIO as GPIO import time OUT5 def init():GPIO.setwarnings(False)GPIO.setmode(GPIO.BCM)GPIO.setup(OUT,GPIO.OUT)#蜂鸣器鸣叫函数 def beep(seconds):GPIO.output(OUT,GPIO.HIGH)time.sleep(seconds)GPIO.output…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...