迷宫算法(二)

翻译 2015年07月13日 14:07:50

接着上一个迷宫算法,我们进一步求解----寻找迷宫中从起点到结束点的步数:

如下图所示的矩阵,可以看出一共有4条路径从入口到出口:

1.   紫色背景的路径

2.   绿色背景的路径

3.   绿色背景和紫色背景交互产生的2条路径。

分析:

2----  墙

1----  已经走过的路径

0----  没有走过的路径

代码部分

#include <iostream>


using namespace std;
void visit(int, int);

int maze[9][9] =

                 {{2, 2, 2, 2, 2, 2, 2, 2, 2},

                  {2, 0, 0, 0, 0, 0, 0, 0, 2},

                  {2, 0, 2, 2,0, 2, 2, 0,2},

                  {2, 0, 2,0, 0, 2, 0, 0, 2},

                  {2, 0, 2,0, 2, 0, 2, 0, 2},

                  {2, 0, 0, 0, 0, 0, 2, 0, 2},

                  {2, 2, 0, 2, 2,0, 2, 2, 2},

                  {2, 0, 0, 0, 0, 0, 0, 0, 2},

                  {2, 2, 2, 2, 2, 2, 2, 2, 2}};

int startI = 1, startJ = 1;  // 入口
int endI = 7, endJ = 7;  // 出口

int main(void) {
    int i, j;

    cout << "display the maze" << endl;

    //打印开始的迷宫数组

    for(i = 0; i < 9; i++)
    {
        for(j = 0; j < 9; j++)
        {
            if(maze[i][j] == 2)    //如果是墙的话,打印‘#’
            {
                cout << "#";
            }
            else     //如果是‘0’,就打印空格
            {
                cout<<" ";        
            }
        }
        cout<<endl;
    }

    visit(startI, startJ);

    return 0;
}

void visit(int i, int j) {
    int m, n;
    maze[i][j] = 1;

    if(i == endI && j == endJ)
    {
        cout << "display the maze" << endl;
        int step = 0;

        for(m = 0; m < 9; m++)

        {

            for(n = 0; n < 9; n++)
            {
                if(maze[m][n] == 2)
                {
                    cout << "#";
                }
               else if(maze[m][n] == 1)
               {
                   ++step;      //这里是所有走过的路径都自加1,当然也包括了起点
                   cout << "*";
               }
               else
               {
                   cout<<" ";
               }
            }
        cout<<endl;
        }
        cout << "total step for this maze is: " << step<<endl;
    
    }

    if(maze[i][j+1] == 0) visit(i, j+1);
    if(maze[i+1][j] == 0) visit(i+1, j);
    if(maze[i][j-1] == 0) visit(i, j-1);
    if(maze[i-1][j] == 0) visit(i-1, j);

    maze[i][j] = 0;     //回调结束以后,把走过的路径再赋值为0,为剩下的通路提供初始条件



运行的结果如下:

A*算法求解迷宫

[cpp] view plaincopy #include   #include   #include   using namespace std;    //方向向量  int direc[4]...
  • u010944926
  • u010944926
  • 2014年03月06日 16:27
  • 1555

递归与非递归实现走迷宫算法

●问题描述:   给出一个矩阵,其中0表示通路,1表示墙壁,这样就形成了一个迷宫,要求编写算法求出其中一条路径。 ●递归思路:   编写一个走迷宫函数,传入二位数组的下标,先假设该点位于最终路径上(...
  • Jung_zhang
  • Jung_zhang
  • 2015年10月09日 20:48
  • 6156

A*算法解决迷宫问题(DIY制作地图类似于小游戏,界面设计非常不错。)

人工智能老师要求实现一个算法,刚开始的时候自己做的是一个深度优先搜索,然后又学了A*,觉得深度优先效率还是不行,就打算用A*算法实现兔子找萝卜的小游戏。   地图设计采用的是坦克大战中的地图设计图案。...
  • yujin753
  • yujin753
  • 2014年03月19日 08:41
  • 3533

迷宫的最短路径之BFS算法

给定一个大小为N*M的迷宫,由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是有解的)(...
  • lrgdongnan
  • lrgdongnan
  • 2016年06月28日 10:19
  • 9103

NYOJ83——迷宫寻宝(二)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=83 题目分析: 好吧,我承认这个题折腾了我接近两个小时~~ 其实这道题就是任选一个四...
  • kay_zhyu
  • kay_zhyu
  • 2013年04月16日 16:02
  • 763

一个简单的迷宫算法

迷宫问题的求解是一个典型的问题,那仫如何找到迷宫的出口?在遇到死胡同的时候如何返回?如何防止走重复的路程?这就是我们要解决的问题了.      一.设置迷宫          要打印一个简单的迷宫,我...
  • qq_34328833
  • qq_34328833
  • 2016年09月11日 08:32
  • 5367

C#三大迷宫生成算法

今天介绍一下很经典的三大迷宫算法的C#实现,即随机普利姆算法,深度优先算法和十字分割(也就是递归分割算法)。实现参考了[ActionScript 3] 三大迷宫生成算法一文(生成的迷宫预览图也使用的该...
  • dark00800
  • dark00800
  • 2017年07月30日 01:17
  • 1006

三大迷宫生成算法 (Maze generation algorithm) -- 深度优先,随机Prim,递归分割

之前同学参加面试,面试官问到迷宫生成算法,这个问题自己想了下也没有好办法,所有就查询了相关资料。这里进行了相关整理: 本文主要讲解的迷宫生成算法有三种: 1.Recursive backtracker...
  • juzihongle1
  • juzihongle1
  • 2017年06月12日 20:31
  • 5218

JS手撸数据结构系列(四) ——Prim算法与迷宫生成

迷宫问题一个100*100的方格的迷宫,障碍未知,只知道起点和终点,以第一视角进入,求最短距离路径。这是当时腾讯二面的面试官给我留的题目,当时只要求写出了BFS求最短路径的算法,那么就会很自然的想到如...
  • scargtt
  • scargtt
  • 2017年05月02日 10:40
  • 1287

走迷宫回溯算法(Java实现)

以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (1) 根据二维数组,输出迷宫的图形。 (...
  • u013474436
  • u013474436
  • 2015年08月25日 15:28
  • 4771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迷宫算法(二)
举报原因:
原因补充:

(最多只允许输入30个字)