递归算法深入浅出五:深度搜索寻找图最短路径

版权声明

        如果你看到这篇文章并不是在我的CSDN博客发布,同时文章里面的图片、URL全没了的,那么,很有可能你上了一个爬虫网站!

        在此,我建议你马上关闭该页面!因为爬虫或多或少都会出现内容的纰漏,对读者造成的危害更大,误人子弟。
        同时,转载本文的请加上本文链接:http://blog.csdn.net/nthack5730/article/details/71774434
        对于爬虫网站随意爬取以及转载不加本文链接的,本人保留追究法律责任的权力!
对于不尊重版权的行为,我们也没必要客气!




递归算法概述及常见算法列表,传送门:
http://blog.csdn.net/nthack5730/article/details/65537530




深度优先搜索

        又称深度搜索、深搜。简单地说深搜就是一种**【不撞南墙不回头】** 的 暴力算法,基本上该算法常用递归作为设计基础,当然也有使用for循环嵌套的,本文是以递归为讲解方向的。
        至于更深一层的理论在这里就不详细说明了,详细可以去搜索更多关于。


简单的图搜索问题

        本文讲述的是一个基于无向图为基础的图搜索,用二位数组组成的图。
        【关于图的更多的理论也麻烦大家去搜索相关的资料,今天写这个文章主要针对下面描述的问题,在这里不过多阐述】


问题描述

描述如下:
在一个n行m列组成的二位数组中,每个单元格代表空地障碍物
邻接的单元格距离单位为1,但不包括对角的单元格。
图中是属于无向图,移动的方向不受限制(不能出界)。
现在给定在图中任意的两个坐标(两个均坐标不属于障碍物),求出两个坐标之间到达的最短距离
 
如图:
这是一个6行5列的图,其中 (1,2)、(3,2)、(3,3) 、(4,1)、(4,2) 为障碍物
递归算法深入浅出五:深度搜索寻找图最短路径_第1张图片
 
求A点到B点的最短距离

问题分析

        问题中可以知道这是一个由二维数组组成的图,每个单元格代表空地或者障碍物。
        现在要从A点到达B点或者从B点到达A点,行走的方向可以是(上、下、左、右),同时要避开所有红色的障碍物(如上图)。首先要明白每走一步所到达的位置:

  • 当在A点(0,0)时,下一步能到达的点为**(0,1)、(1,0)**
  • 当在点**(0,1)时,下一步能到达的点为(0,0)、(1,1)、(1、2)**
  • 当在点**(1,0)时,下一步能到达的点为(0,0)、(2,0)、(1、1)**
  • 当在点**(1,1)时,由于(1,2)为障碍物**,因此下一步能到达的点为**(0,1)、(1,0)、(2,1)**
  • 每一步都去尝试下一步可以到达的位置,直到到达终点B。

        有个问题就来了,例如上面的,有的位置是已经被走过的,如果程序没有对走过的位置进行判断,那么可能永远都不能到达B点...
        应该怎么做呢?定义一个结果集来记录当前访问过的点。
        请慢慢往下看,别急!




递归程序设计思路

一、定义

1. 设定地图

我们可以用一个二维的 int 数组来表示该图,我们假设在数组中:

  • 值为 1 的是障碍物
  • 值为 0 的是为空地
  • 注意:使用二维int数组的原因是:如果需要,可以用数字表示不同类型的障碍物,本问题中可以用boolean数组表示空地或障碍物,但为了让大家更加清晰不和下面的 boolean[][] used 二维标记数组弄混,还是使用 int[][] map 来定义。

那么就可以得出下列二维数组:

0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 1 1 0
0 1 1 0 0
0 0 0 0 0

2. 首先是定义需要用上的变量:

  • int n,m:定义图的大小。
  • int[][] map:需要搜寻的图(在这里用int[][]二维数组表示)
  • boolean[][] used:大小和图一样,用于标记被访问过的点(访问过为true),保证每次走的都是没有被走过的点,这也是解决上面的重复访问同一个点的问题的方案

你可能感兴趣的:(-----算法,大话经典算法,深度搜索,深搜,图,最短路径,图搜索)