当前位置: 首页 > 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…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

网站指纹识别

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