zoukankan      html  css  js  c++  java
  • 迷宫问题算法分析

    首先给出经典的算法,然后分析算法的实现

    #define    MAX_SIZE  8
    int H[4] = { 0, 1, 0, -1 };
    int V[4] = { -1, 0, 1, 0 };
    char Maze[MAX_SIZE][MAX_SIZE] =
                                   {{'X','X','X','X','X','X','X','X'},
                                     {'o','o','o','o','o','X','X','X'},
                                     {'X','o','X','X','o','o','o','X'},
                                     {'X','o','X','X','o','X','X','o'},
                                     {'X','o','X','X','X','X','X','X'},
                                     {'X','o','X','X','o','o','o','X'},
                                     {'X','o','o','o','o','X','o','o'},
                                     {'X','X','X','X','X','X','X','X'}};

    void FindPath(int X, int Y)

    {
    if(X == MAX_SIZE || Y == MAX_SIZE)
    {
              for(int i = 0; i < MAX_SIZE; i++)
    for(int j = 0; j < MAX_SIZE; j++)
                      printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : ' ');
    }
    else
    for(int k = 0; k < 4; k++)
    if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE
    && 'o' == Maze[X][Y])
    {
                          Maze[X][Y] = ' ';
                          FindPath(X+V[k], Y+H[k]);
                          Maze[X][Y] = 'o';
    }
    }

    int main(int argc, char* argv[])
    {
        FindPath(1,0);
    }

    首先解释一下迷宫问题,就是从一个迷宫中找出从指定的起点到终点的所有的可能的路径的问题

    在上面的例子('o'表示路径可行,‘X’表示路径不通)中其实是从一个6X8的迷宫中找出所有的可能的路径,增加了两行‘X’方便程序的处理,这样问题就成了从一个8X8的迷宫中找路径的问题了 ,起点是(1,0)终点是(6,7)。

    FindPath(1,0); //当然是从起点开始找路径的意思了

    进入到递归函数中去了之后显然是执行的else里面的语句

    else
    for(int k = 0; k < 4; k++)//这个for loop啥意思呢, 很容易想到是要遍历当前位置的上下左右的位置的意思
    if(X >= 0 && Y >= 0 && Y < MAX_SIZE && X < MAX_SIZE
    && 'o' == Maze[X][Y])
    {
                          Maze[X][Y] = ' ';//这里为什么要将符合条件的位置置空,有两个用途1,放置遍历过的位置重复遍历,退出一层递归(在这里是不满足else的条件时)的时候方便输出结果(可先运行代码查看结果)
                          FindPath(X+V[k], Y+H[k]);//从V[k],H[k]可以看出V 和H这两个数组是来表示位置的 (X+(-1),Y+0)就是表示方的的位置, 从这里可以看出遍历当前位置的临近位置的顺序是up、right、bottom、left
                          Maze[X][Y] = 'o'; //递归退出之后要将当前我位置恢复, 否则的话, 该递归最多只能找到一种路径
    }

    再看退出一层递归时执行的代码

    if(X == MAX_SIZE || Y == MAX_SIZE)
    {
              for(int i = 0; i < MAX_SIZE; i++)
    for(int j = 0; j < MAX_SIZE; j++)
                      printf("%c%c", Maze[i][j], j < MAX_SIZE-1 ? ' ' : ' ');
    }

    //很明显是将这个8X8的数组按照一定的格式输出,注意输出之后整个递归过程并没有退出这是(X,Y)往往又会满足else里面的条件哦,这样的话,就能将所有的路径遍历出来,怎么样?这个算法还是蛮经典嘛,当然我在这里只是将这个经典算法分析一下, 有更好的方案, 还请大家不吝赐教。



  • 相关阅读:
    使用vue自定义组件以及动态时间
    vue案列
    解决adb devices无法连接夜神模拟器
    手动解除浏览器跨域限制
    HBuilder实现WiFi调试Android
    Spring mvc文件下载
    3大框架Struts、Hibernate、Spring简单了解
    简单了解ajax
    使用本地计划任务定时关闭azure虚拟机
    调整虚拟机的尺寸
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3153458.html
Copyright © 2011-2022 走看看