---恢复内容开始---

http://wenku.baidu.com/view/63e7b8270066f5335a812142.html

迷宫最短路径问题解析

有一个二维数组,0表示路,-1表示墙,求其中任意两点的最短路径。

我们先看,怎么求一条路径:求两点路径是一个数据结构上的典型的迷宫问题,很多数据结构的书上都有介绍,解决办法如下:

从一点开始出发,向四个方向查找,每走一步,把走过的点的值+1(即本节点值+1),防止重复行走,并把走过的点压入堆栈(表示路径),如果遇到墙、或者已走过的点则不能前进,如果前方已经无路可走,则返回,路径退栈,这样递归调用,直到找到终点为止。

迷宫如下图所示:

从(2, 1)到(6, 8),程序如下所示:

struct Postion
{
    int _X, _Y;

    Postion(){}
    Postion(int X, int Y)
        : _X(X), _Y(Y){}
};

bool isCanGo(const int prePosValue,
             const int posX,
             const int posY)
{
    if (   posX < 0 || posX > 9        // 越界
        || posY < 0 || posY > 9        
        || maze[posX][posY] == -1    // 墙
        || maze[posX][posY] >= 1)    // 走过
    {
        return false;
    }

    return true;
}


stack<Postion> path__;            //路径
        
Postion offset[4];                //路径

bool shortestPath(stack<Postion> &path,
                  const Postion &start,
                  const Postion &end)
{
    if (   start._X == end._X 
        && start._Y == end._Y)
    {
        path__ = path;
        return true;
    }
    
    for (int i = 0; i < 4; i++)
    {
        int nNextPos_X = start._X + offset[i]._X;
        int nNextPos_Y = start._Y + offset[i]._Y;

        if (isCanGo(maze[start._X][start._Y], nNextPos_X, nNextPos_Y))
        {
            maze[nNextPos_X][nNextPos_Y] = maze[start._X][start._Y] + 1;

            path.push(Postion(nNextPos_X, nNextPos_Y));

            if (shortestPath(path, Postion(nNextPos_X, nNextPos_Y), end))
                return true;

            path.pop();
        }
    }

    return false;
}

int main(int argc, char* argv[])
{
    offset[0]._X = -1;    offset[0]._Y = 0;    // 上
    offset[1]._X = 1;    offset[1]._Y = 0;    // 下
    offset[2]._X = 0;    offset[2]._Y = -1;    // 左
    offset[3]._X = 0;    offset[3]._Y = 1;    // 右

    printMat(maze);


    Postion start(2, 1), end(6, 8);
    maze[start._X][start._Y] = 1;            // 置起点值1, 防止走回起点
    shortestPath(stack<Postion>(), start, end);

    printPath(path__);
    printMat(maze);

    return 0;
}

这时,我们经过运算,到达终点,有44步之多。如果我们调整调用offset的顺序,即先左右,后上下,可能会得到更短的路径,但无法确保在任何情况下都能得到最短路径。

得到最短路径的方法,解决方法如下:

每走一步,就对前方的节点赋值为此节点+1,走过的路径也可以重复行走。但有一个条件,就是本节点+1必须小于已走过的节点的权值(墙不能走),这样走遍所有的节点,记录最短的路径。

主要修改了以下两个函数:

bool isCanGo(const int prePosValue,
             const int posX,
             const int posY)
{
    if (   posX < 0 || posX > 9        // 越界
        || posY < 0 || posY > 9        
        || maze[posX][posY] == -1)    // 墙
    {
        return false;
    }

    if (maze[posX][posY] == 0)    // 未走过
        return true;
    else                        // 更近的路径
        return (prePosValue + 1) < maze[posX][posY];
}

void shortestPath(stack<Postion> &path,
                  const Postion &start,
                  const Postion &end)
{
    if (   start._X == end._X 
        && start._Y == end._Y)
    {
        if (path.size() < path__.size() || path__.empty())    // 更短的路径
            path__ = path;
        return;
    }
    
    for (int i = 0; i < 4; i++)
    {
        int nNextPos_X = start._X + offset[i]._X;
        int nNextPos_Y = start._Y + offset[i]._Y;

        if (isCanGo(maze[start._X][start._Y], nNextPos_X, nNextPos_Y))
        {
            maze[nNextPos_X][nNextPos_Y] = maze[start._X][start._Y] + 1;

            path.push(Postion(nNextPos_X, nNextPos_Y));

            shortestPath(path, Postion(nNextPos_X, nNextPos_Y), end);

            path.pop();
        }
    }
}
 

我上传了两个工程,求一条路径的程序点此下载,求最短路径的程序点此下载。

文章结束!愿它对您有所帮助

---恢复内容结束---

http://wenku.baidu.com/view/63e7b8270066f5335a812142.html

迷宫最短路径问题解析

有一个二维数组,0表示路,-1表示墙,求其中任意两点的最短路径。

我们先看,怎么求一条路径:求两点路径是一个数据结构上的典型的迷宫问题,很多数据结构的书上都有介绍,解决办法如下:

从一点开始出发,向四个方向查找,每走一步,把走过的点的值+1(即本节点值+1),防止重复行走,并把走过的点压入堆栈(表示路径),如果遇到墙、或者已走过的点则不能前进,如果前方已经无路可走,则返回,路径退栈,这样递归调用,直到找到终点为止。

迷宫如下图所示:

从(2, 1)到(6, 8),程序如下所示:

struct Postion
{
    int _X, _Y;

    Postion(){}
    Postion(int X, int Y)
        : _X(X), _Y(Y){}
};

bool isCanGo(const int prePosValue,
             const int posX,
             const int posY)
{
    if (   posX < 0 || posX > 9        // 越界
        || posY < 0 || posY > 9        
        || maze[posX][posY] == -1    // 墙
        || maze[posX][posY] >= 1)    // 走过
    {
        return false;
    }

    return true;
}


stack<Postion> path__;            //路径
        
Postion offset[4];                //路径

bool shortestPath(stack<Postion> &path,
                  const Postion &start,
                  const Postion &end)
{
    if (   start._X == end._X 
        && start._Y == end._Y)
    {
        path__ = path;
        return true;
    }
    
    for (int i = 0; i < 4; i++)
    {
        int nNextPos_X = start._X + offset[i]._X;
        int nNextPos_Y = start._Y + offset[i]._Y;

        if (isCanGo(maze[start._X][start._Y], nNextPos_X, nNextPos_Y))
        {
            maze[nNextPos_X][nNextPos_Y] = maze[start._X][start._Y] + 1;

            path.push(Postion(nNextPos_X, nNextPos_Y));

            if (shortestPath(path, Postion(nNextPos_X, nNextPos_Y), end))
                return true;

            path.pop();
        }
    }

    return false;
}

int main(int argc, char* argv[])
{
    offset[0]._X = -1;    offset[0]._Y = 0;    // 上
    offset[1]._X = 1;    offset[1]._Y = 0;    // 下
    offset[2]._X = 0;    offset[2]._Y = -1;    // 左
    offset[3]._X = 0;    offset[3]._Y = 1;    // 右

    printMat(maze);


    Postion start(2, 1), end(6, 8);
    maze[start._X][start._Y] = 1;            // 置起点值1, 防止走回起点
    shortestPath(stack<Postion>(), start, end);

    printPath(path__);
    printMat(maze);

    return 0;
}

这时,我们经过运算,到达终点,有44步之多。如果我们调整调用offset的顺序,即先左右,后上下,可能会得到更短的路径,但无法确保在任何情况下都能得到最短路径。

得到最短路径的方法,解决方法如下:

每走一步,就对前方的节点赋值为此节点+1,走过的路径也可以重复行走。但有一个条件,就是本节点+1必须小于已走过的节点的权值(墙不能走),这样走遍所有的节点,记录最短的路径。

主要修改了以下两个函数:

bool isCanGo(const int prePosValue,
             const int posX,
             const int posY)
{
    if (   posX < 0 || posX > 9        // 越界
        || posY < 0 || posY > 9        
        || maze[posX][posY] == -1)    // 墙
    {
        return false;
    }

    if (maze[posX][posY] == 0)    // 未走过
        return true;
    else                        // 更近的路径
        return (prePosValue + 1) < maze[posX][posY];
}

void shortestPath(stack<Postion> &path,
                  const Postion &start,
                  const Postion &end)
{
    if (   start._X == end._X 
        && start._Y == end._Y)
    {
        if (path.size() < path__.size() || path__.empty())    // 更短的路径
            path__ = path;
        return;
    }
    
    for (int i = 0; i < 4; i++)
    {
        int nNextPos_X = start._X + offset[i]._X;
        int nNextPos_Y = start._Y + offset[i]._Y;

        if (isCanGo(maze[start._X][start._Y], nNextPos_X, nNextPos_Y))
        {
            maze[nNextPos_X][nNextPos_Y] = maze[start._X][start._Y] + 1;

            path.push(Postion(nNextPos_X, nNextPos_Y));

            shortestPath(path, Postion(nNextPos_X, nNextPos_Y), end);

            path.pop();
        }
    }
}
 

我上传了两个工程,求一条路径的程序点此下载,求最短路径的程序点此下载。

文章结束!愿它对您有所帮助

转载于:https://www.cnblogs.com/Wind-Blog/p/3248036.html

http://wenku.baidu.com/view/63e7b8270066f5335a812142.html相关推荐

  1. 分区文件http://wenku.baidu.com/view/d839d1868762caaedd33d4b7.html

    http://wenku.baidu.com/view/d839d1868762caaedd33d4b7.html

  2. https://wenku.baidu.com/view/1f9138e903d8ce2f01662306.html

    https://wenku.baidu.com/view/1f9138e903d8ce2f01662306.html

  3. https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html--swot

    https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html 转载于:https://www.cnblogs.com/anruy/p/97519 ...

  4. Analysis of Struts2 : http://wenku.baidu.com/view/ad421874a417866fb84a8e75.html

    http://wenku.baidu.com/view/ad421874a417866fb84a8e75.html

  5. http://wenku.baidu.com/view/981f99d376eeaeaad1f330e7.html

    http://wenku.baidu.com/view/981f99d376eeaeaad1f330e7.html

  6. http://wenku.baidu.com/view/d6433106a6c30c2259019e63.html

    http://wenku.baidu.com/view/d6433106a6c30c2259019e63.html

  7. https://wenku.baidu.com/view/24def725e53a580217fcf

    https://wenku.baidu.com/view/24def725e53a580217fcfe6d.html 转载于:https://blog.51cto.com/11067786/23404 ...

  8. http://wenku.baidu.com/view/8378e414f18583d049645951.html

    http://wenku.baidu.com/view/8378e414f18583d049645951.html http://wenku.baidu.com/view/a88aff0d6c85ec ...

  9. http://wenku.baidu.com/view/fb90c0c008a1284ac850434b.html

    http://blog.csdn.net/21aspnet/article/details/160019 http://wenku.baidu.com/view/fb90c0c008a1284ac85 ...

最新文章

  1. php worker微信,微信小程序API createWorker
  2. winforms 动态画折线 不用chart_QT charts 动态刷新曲线图
  3. Python和OpenCV环境配置
  4. java B2B2C Springcloud多租户电子商城系统-Spring Cloud Sleuth
  5. 百度云cdn设置州五年制大专_[百度云CDN]配置过程坑点集合
  6. java 最优算法_java 问题 求个最优算法
  7. EditText数据回显
  8. (转载)深入理解WeakHashmap
  9. (7)机器学习之make_bolbs
  10. win下使用curl
  11. Iterator中的 FailFast FailSafe【学习笔记】
  12. a标签实现下载图片功能
  13. UTC(世界标准时间)/GMT(格林威治时间)/CST(北京时间)
  14. bal插口_调音台上的英文缩写都是什么意思 调音台上面那几个插口是什么作用...
  15. 新颖的基于互联网的毕业设计题目50例
  16. 盘点庚子年里,火到出圈的人工智能应用
  17. (附源码)springboot停车场车辆定位管理可视化分析系统的设计与实现 毕业设计101702
  18. 血族服务器暂时无法登录,天之炼狱归来服务端7.01架设教程问题解答
  19. myeclipse building workspace如何禁止及提高myeclipse速度
  20. 马士兵网络安全大师班

热门文章

  1. python的编程模式-Python 编程,应该养成哪些好的习惯?
  2. python有道翻译-Python版有道翻译
  3. php和python区别-php和python什么区别
  4. python可以自学吗-python可以自学吗
  5. python官网下载哪个版本-python下载哪个版本好
  6. python文件输出-python 文件的输入输出
  7. python测试开发自学教程-测试开发学习路线图
  8. python3.6.5安装教程-Centos7 安装Python3.6.5步骤
  9. python基础语法有哪些-Python基础语法一
  10. python基础代码事例-推公式到写代码-python基础