【数据结构】使用栈Stack解决迷宫问题

原创 2016年05月30日 17:18:25

      我们看下面这个迷宫----方阵(也可以是矩阵):

wKiom1cMngag6p87AAAffRONdMg639.png


     迷宫入口是坐标(2,0)位置,出口是(9,3)。我们假定0代表通路,1代表不通。


     现在需要找到哪一条路是通路。我们的思想是借助栈,“回溯法”。回溯是什么意思呢???先从起点出发,检查它的上下左右是否是通路(即是否有为数字0处)。也就是说为0通了,压栈,将此位置元素变成2,这样做的好处是明确通路路径。然后继续往下走,判断上下左右 。直至我们找到终点(纵坐标在矩阵的最后一行)。


     我们来看下我针对迷宫问题实现的代码:


#include<stack>
#include<assert.h>
#define N 10    //该迷宫10*10.

struct Pos    //定义一个结构体,该结构体用来表示坐标。
{
    int _row;
    int _col;

    Pos(int row,int col)
        :_row(row)
        , _col(col)
    {}
};


template<class T>
bool SearchMazePath(int* a, int n, Pos entry, stack<T>& paths)    //寻找迷宫是否有通路。
{
    assert(a);
    
    paths.push(entry);
    while (!paths.empty())
    {
        Pos cur = paths.top();
        a[cur._row*n + cur._col] = 2;            
        if (cur._row == n - 1)
        {
            return true;
        }

        //上
         Pos tmp = cur;
        --tmp._row;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
        //下
        tmp = cur;    
        ++tmp._row;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
        //左
        tmp = cur;        
        --tmp._col;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
         //右
       tmp = cur;
        ++tmp._col;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
        paths.pop();    //若上下左右都不通,则回溯。
    }
    
    return false;
}


void GetMaze(int* a, int n)    //读取到迷宫图案
{
    assert(a);
    FILE* fout = fopen("MazeMap.txt", "r");
    assert(fout);    //若文件打开失败,后续工作则无法完成,因此采用assert防御式编程。
    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            while (true)
            {
                int men = fgetc(fout);    //读取字符
                if (men == '0' || men == '1')    //是0或者1则转换成数字到二维矩阵中存储。
                {
                    a[i*n + j] = men -'0';
                    break;    
                }                
            }
        }
    }       
}

void PrintMaze(int* a, int n)    //将此迷宫打印出来
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n;j++ )
        {
            cout << a[i*n + j] << "  ";
        }
        cout << endl;
    }
    cout << endl;
}


void Test()
{
    int a[N][N] = {};
    Pos sp(2, 0);    //入口坐标
    
    GetMaze((int*) a, N);
    PrintMaze((int*)a, N);
    stack<Pos> paths;
    
    SearchMazePath((int*)a, N, sp, paths);  
    //二维数组实际存储是一维数组,将二维数组强制转换为一维数组传参。
    PrintMaze((int*)a, N);
}


int main()
{
    Test();
    system("pause");
    return 0;
}


      有时候,针对迷宫问题,我们还需要求多条路径的最优解(最短路径)。那这时候我们可以用压栈,利用栈帧一层一层压栈的特点实现。

本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1763002

迷宫寻路数据结构栈实现

  • 2009年05月22日 13:24
  • 8KB
  • 下载

数据结构例程——迷宫问题(用栈结构)

本文针对数据结构基础系列网络课程(3):栈和队列中第6课时栈的应用2-迷宫问题。例:求出从入口到出口的路径 程序实现:#include #define MaxSize 100 #define M ...
  • sxhelijian
  • sxhelijian
  • 2015年09月15日 11:41
  • 12569

栈的使用-迷宫算法实现代码-摘自数据结构实现java版本(个人笔记整理)

//首先cell类 package list; public class Cell { private int x;//坐标x private int y;//左边y private...
  • soybeen
  • soybeen
  • 2017年04月30日 22:55
  • 257

栈求解迷宫问题

问题:假设下图是某迷宫的地图,问此迷宫是否有一条通路 求解思想: 用栈来实现解决问题,主要步骤是 (1)从迷宫的...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016年04月11日 23:16
  • 3415

运用栈求解迷宫问题C/C++

用栈解决基本的迷宫问题C/C++ 1、问题描述:设置迷宫为m*n的二维数组,起点坐标为(1,1),中点坐标为(m,n),0为通路,1为死路,为防止数组越界将四周设置边界1,即数组变为(m+2)*(n...
  • g15827636417
  • g15827636417
  • 2016年10月07日 16:18
  • 4987

迷宫问题(栈及递归两种实现方式)

  • 2010年06月22日 23:19
  • 953KB
  • 下载

迷宫问题(顺序栈)

#include #include #define MAXSIZE 50 #define k 4 //四个方向 #define m 6 //迷宫的实际行 #define n 8 //迷宫的实际列...
  • qq_23693629
  • qq_23693629
  • 2015年10月12日 20:37
  • 420

数据结构--用栈求解迷宫问题(非最优解)

数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦。 BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点...
  • huangyong000
  • huangyong000
  • 2016年05月09日 18:57
  • 3596

数据结构(C语言版)”栈与队列“章节迷宫求解问题的思路与实现

迷宫求解问题来源自”数据结构(C语言版)“一书第50页的例题。该例题要求在不使用递归(因为暂时还没讲到),只能通过使用诸如入栈出栈的方式获取一条可以走出迷宫的路径。     在看完文字提示后,我就没有...
  • u010676110
  • u010676110
  • 2015年05月11日 18:51
  • 2248

c++ 栈 解决迷宫问题

  • 2011年03月20日 20:57
  • 799B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据结构】使用栈Stack解决迷宫问题
举报原因:
原因补充:

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