我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java实现深度搜索DFS算法详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java实现深度搜索DFS算法详解

DFS概述

深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。

解释

思路

一般用矩阵表示,从当前点开始,依次向周围四个方向试探,在我们给定数值条件下依次搜索(1代表不能走,0代表能走),对走过的路进行标记,如果最终达到了要走的点,就会进行回溯,回溯时,会将已经走过的点再次标记为未走,回到出发点,进行别的方向的试探

当找到距离最短的,而且到达了终点时,停止访问,输出结果

案例题-单身的蒙蒙

题目描述

蒙蒙要找对象啦!但是对象在和他玩捉迷藏,现在有一个55的地图,蒙蒙就在(0,0)的位置,他的心上人就在(4,4)的位置,当然路上会有各种艰难险阻,现在说明一下规则。蒙蒙按照地图行动,一次走一步,而且他只能前后左右的移动,当然蒙蒙也不能穿越墙壁。地图上有两种图案,一种是‘0'表示可以走的路,另一种是‘1'表示不能走的墙

PS:(0,0)就是左上角,(4,4)就是右下角,都懂吧!

输入:

输入一个55的矩阵表示地图,‘0'表示可以走的路,‘1'表示不能走的墙,蒙蒙就在(0,0)的位置,他的心上人就在(4,4)的位置

输出:

输出蒙蒙到心上人那里最少要走多少步,若蒙蒙永远走不到心上人那里,则输出-1

输入样例:

0 1 0 0 0

0 0 0 1 0

0 1 0 1 0

0 1 0 0 0

0 0 0 1 0

输出样例:

8

题解

分析: 首先分析下,主人公要想能够找到对象,就需要走到左下角,而去的过程显然不是一帆风顺的,它会遇到墙壁,遇到墙壁就会返回,返回到前一个点之后向其他方向进行搜索,如果有通路,就会接着执行这步的操作,直到找到终点。题目中问的是最少要通过多少步才能找到对象,那么显然可能一次搜索找不到最短的路径,这里就需要回溯,把回溯的点设置为未标记,回溯到最初的点之后进行其他方向的遍历,如果第二次到达终点的值小于第一次的就更新路径,将第二次的路径作为最小的路径,直到所有点遍历完


//回溯算法
flag[xx][yy]=1//标记
dfs(1,1,step+1)
//flag[xx][yy]=0;设置为未标记的点,进行回溯

方向数组 因为要进行四个方向的试探,所以要定义一个方向数组:方向数组的定义可以使用一维数组,亦可以使用二维数组,建议大家使用一维数组,直观明了,这里解释下便于方便,将标准坐标轴顺时针方向旋转了90度,令x=0;y=0则可有四个方向坐标 右:(0,1),下:(1,0),左:(0,-1),上:(-1,0),依次取dx一次,dy一次,就和上面的坐标一致了


    static int[] dx = {0, 1, 0, -1};//方向数组,顺时针:右 下 左 上
    static int[] dy = {1, 0, -1, 0};

注意事项: 这里因为输入的是从原点开始,而外界临界值也是等同于墙壁,为了免去试探,可以将四边的设置为“1”墙壁,这样可以避免数组越界


 //试探墙壁,避免越界
        for(int i = 0; i <=6;i++){
           s[0][i]=1;
           s[i][0]=1;
           s[6][i]=1;
           s[i][6]=1;
        }

整体代码


import java.util.Scanner;
public class test2 {

    static int[][] s = new int[10][10];
    static int[][] flag = new int[10][10];

    static int min = 99;//初始化认为该路径很大
    static int[] dx = {0, 1, 0, -1};//方向数组,顺时针:右 下 左 上
    static int[] dy = {1, 0, -1, 0};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //试探墙壁,避免越界
        for (int i = 0; i <= 6; i++) {
            s[0][i] = 1;
            s[i][0] = 1;
            s[6][i] = 1;
            s[i][6] = 1;
        }
        //将外围墙壁左上角顶点设置为(0,0)
        for (int i = 1; i < 6; i++)//这里的从1开始,省去外围墙壁带来的不便
        {
            for (int j = 1; j < 6; j++) {
                s[i][j] = sc.nextInt();
            }
        }
        int sx = 1, sy = 1;//从(1,1)开始
        flag[sx][sy] = 1;//进行标记
        dfs(sx, sy, 0);//搜索
        if (min == 99)//如果值还是原来的,就说明不存在
            System.out.println("-1");
        else
            System.out.println(min);
    }

    public static void dfs(int x, int y, int step) {
        if (x == 5 && y == 5) {//到达了右下角,终点
            if (step < min) {//如果当前步数小于之前的
                min = step;//标记更新
            }
            return;//否则返回空
        }
        for (int i = 0; i < 4; i++) {//控制方向数组
            int xx = x + dx[i];//进行右,下,左,上搜索
            int yy = y + dy[i];
            if (flag[xx][yy] == 0 && s[xx][yy] == 0) {//如果未被标记,并且原来该位置的值为0
                flag[xx][yy] = 1;//标记
                dfs(xx, yy, step + 1);
                flag[xx][yy] = 0;//回溯
            }
        }

    }
} 

到此这篇关于Java实现深度搜索DFS算法详解的文章就介绍到这了,更多相关Java 深度搜索DFS算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java实现深度搜索DFS算法详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java实现深度优先搜索(DFS)和广度优先搜索(BFS)算法

深度优先搜索(DFS)和广度优先搜索(BFS)是两种基本的图搜索算法,可用于图的遍历、路径搜索等问题。DFS采用栈结构实现,从起点开始往深处遍历,直到找到目标节点或遍历完整个图;BFS采用队列结构实现,从起点开始往广处遍历,直到找到目标节点或遍历完整个图
2023-05-18

C语言中深度优先搜索(DFS)算法的示例详解

这篇文章主要通过两个简单的示例为大家详细介绍一下C语言中深度优先搜索(DFS)算法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-02-16

Python实现线性搜索算法详解

线性搜索是最简单的搜索算法,从数据集的开头开始,检查每一项数据,直到找到匹配项,一旦找到目标,搜索结束。线性搜索算法的缺点需要注意的是线性搜索算法尽管简单,但不适用数据大的情况,由于算法将每个数据一一比较,所以数据越多,耗时越长。线性
Python实现线性搜索算法详解
2024-01-23

Java如何实现基于图的深度优先搜索和广度优先搜索

这篇文章将为大家详细讲解有关Java如何实现基于图的深度优先搜索和广度优先搜索,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.新建一个表示“无向图”类NoDirectionGraphpackage co
2023-05-30

Python怎么实现图的广度和深度优先路径搜索算法

本篇内容主要讲解“Python怎么实现图的广度和深度优先路径搜索算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现图的广度和深度优先路径搜索算法”吧!前言图是一种抽象数据结构
2023-06-30

C++回溯算法之深度优先搜索详细介绍

回溯在迷宫搜索中使用很常见,就是这条路走不通,然后返回前一个路口,继续下一条路。回溯算法说白了就是穷举法,下面让我们一起来看看回溯算法中深度优先搜索吧
2023-01-13

深度解读Python如何实现dbscan算法

DBScan 是密度基于空间聚类,它是一种基于密度的聚类算法,其与其他聚类算法(如K-Means)不同的是,它不需要事先知道簇的数量。本文就来带大家了解一下Python是如何实现dbscan算法,感兴趣的可以了解一下
2023-02-06

Java数据结构之图的两种搜索算法详解

在很多情况下,我们需要遍历图,得到图的一些性质。有关图的搜索,最经典的算法有深度优先搜索和广度优先搜索,接下来我们分别讲解这两种搜索算法,需要的可以参考一下
2022-11-13

Python实现调度算法代码详解

调度算法 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。 在
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录