博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
采用矩阵+深度优先算法解决迷宫问题
阅读量:6839 次
发布时间:2019-06-26

本文共 2528 字,大约阅读时间需要 8 分钟。

所谓深度优先算法,百科的解答是这样的

深度优先搜索算法(Depth-First-Search),简称DFS,是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。

通俗的说,就是足够“深”的遍历树的所有节点分支并且遍历过的节点不会再去访问,很适合做网络爬虫,你懂得^ ^


而迷宫问题也是数据结构里面一道经典的问题了,首先我们先用矩阵创建一个迷宫;

const arr = [        [0,0,0,1,0],        [0,1,1,1,0],        [0,1,0,0,0],        [0,0,0,1,0],        [0,1,1,1,0]    ];

其中数字1代表墙壁,数字0代表路,最左上角代表入口,最右下角代表出口,这里我们不考虑“死路”的情况

const arr = [    [0,0,0,1,0],    [0,1,1,1,0],    [0,1,0,0,0],    [0,0,0,1,0],    [0,1,1,1,0]];//创建迷宫const pathX = [1,-1,0,0];//创建一个数组代表上下左右,在advance这个函数会用到const pathY = [0,0,-1,1];//同上,区别在于矩阵的行和列let _arrLength = arr.length-1;let _arrElementLength = arr[0].length-1;let i=0,j=0;(function(){    console.time("time")//用于测试运算时间    arr[0][0] = 3;//数字3代表已经走过的路,一开始默认从入口进入    function matrix(i,j){        let k,newi,newj;        for(k = 0;k<4;k++){ //上下左右总共四个方向            if (advance(i,j,k)) {                   /*                通过advance函数的判断返回一个可走的路的点                */                newi = i + pathX[k];                newj = j + pathY[k];                                   arr[newi][newj] = 3;//将这个点定义为已走过的点                                /*                判断此时是否已经到了终点如果没有则递归                */                if (newi == _arrLength && newj == _arrElementLength) {                    end()                } else {                       matrix(newi,newj);                   }               }        }        arr[i][j] = 2    }    matrix(0,0)    function advance(i,j,k){        var bool = true;         /*        每走一步路就判断其上下左右是否还有路可走        */        i += pathX[k];        j += pathY[k];        /*        判断临界范围,保证在迷宫范围内        */        if(i<0||i>_arrLength||j<0||j>_arrElementLength){            bool = false;        }else if(arr[i][j]!=0){            bool = false;        }        return bool;    }    /*    负责输出结果    */    function end(){        let i,j,newArr=[];        for (i = 0; i < _arrLength+1; i++) {               for (j = 0; j < _arrLength+1; j++) {                   if (arr[i][j] == 3) {                     newArr.push("V");                  } else {                       newArr.push("*");                   }            }           }        /*        下面这段代码只是为了能够在控制台看得更直观,可无,因为写得有点笨拙        */        newArr.splice(0,0,"")        newArr.splice(6,0,"\n");        newArr.splice(12,0,"\n");        newArr.splice(18,0,"\n");        newArr.splice(24,0,"\n");        console.log(newArr.join(" "));    }    console.timeEnd("time")})()

最终的路线图如下

图片描述

转载地址:http://bzkul.baihongyu.com/

你可能感兴趣的文章
Redis未授权访问及安全组漏洞招致kerberods来挖矿
查看>>
ip 归属地查询
查看>>
php xampp redis扩展
查看>>
apache 403
查看>>
scanf函数
查看>>
阿里云不做SaaS、要练好内功被集成,发布SaaS加速器
查看>>
双系统如何正确的删除Ubuntu
查看>>
大话it职场之经历风雨是否能见彩虹
查看>>
二叉树的遍历与还原
查看>>
我的友情链接
查看>>
二进制安装MariaDB 5.5.36
查看>>
我的友情链接
查看>>
DNS 安装与解析
查看>>
如何实现低成本site to site ***?
查看>>
用ProxyFactoryBean创建AOP代理
查看>>
使用MDT2013部署Win8系统之三 配置MDT服务器之导入操作系统
查看>>
An internal error occurred during: "Building workspace". Java heap space
查看>>
我的友情链接
查看>>
MongoDB 安装以及系统服务配置方法
查看>>
RAID 技术介绍
查看>>