迷宫的求解是一个经典的问题,一直以来都想自己动手写写,虽然网上有无数的代码,虽然对算法比较清楚,但我觉得只有在不参考任何资料的情况下,能写的出来才算是真正掌握。今天有时间,有心情,终于静下心来写完了这个程序。尽管代码很短,可还是花了两个多小时,发现自己动手能力太差了。
        下面是源码:

#include <iostream>
#include <stack>
#include <list>
#include <assert.h>
#include <fstream>

using namespace std;

struct Position{  //定义位置结构体
    int r;
    int c;
};

bool FindPath(Position start,Position end,stack<Position>& pos,int **maze)
{
    Position current = start;

//定义探寻的四个方向
    Position offset[4];
    offset[0].r=-1; offset[0].c=0;   //up
    offset[1].r=0;  offset[1].c=1;   //right
    offset[2].r=1;  offset[2].c=0;   //down
    offset[3].r=0;  offset[3].c=-1;  //left

int di=0;
    int lastDi=3;
    int row,col;

while(current.c!=end.c || current.r!=end.r)//没有找到出口
    {
        while(di<=lastDi)   //从当前位置按顺时针顺序探寻
        {
            row = current.r+offset[di].r;
            col = current.c+offset[di].c;
            if (maze[row][col] == 0)//下一个位置可行
            {
                break;
            }
            di++;
        }
        //find a througth path
        if (di <= lastDi)//找到下一个可行的位置
        {
            pos.push(current);//将当前位置入栈
            current.r = row;
            current.c = col;
            maze[row][col] = 1;//标记当前位置为不可通过,以免陷入死循环
            di = 0;
        }
        else//没有找到相邻的通行线路
        {
            if (pos.empty())//没有找到通路
            {
                return false;
            }
            Position next;
            next= pos.top();
            pos.pop();
            if (next.c = current.c)//取得当前应探寻的方向
            {
                if ( next.r>current.r )
                {
                    di = 1;
                }
                else
                    di = 3;
            }
            else if (next.r = current.r)
            {
                di = 3 + next.c-current.c;
            }
            current = next;//标记当前位置为栈顶位置
        }

}
    pos.push(end);//将出口入栈

return true;
}

int main()
{
    ifstream in("maze.dat");//定义迷宫文件
    assert(in);    
    
    int row,col;
    int i,j;

in>>row>>col;//读入迷宫的行和列

//定义迷宫数组,迷宫四周加墙,以使迷宫边界与内部节点同等处理
    int **maze=new int*[row+2];
    for (i=0; i<row+2; i++)
    {
        maze[i] =new int[col+2];
    }
    
    for (i=0;i<row+2;i++)//迷宫四周为墙,设置为不可通过
    {
        maze[i][0] = maze[i][col+1] = 1;
    }
    for (j=0;j<col+2;j++)
    {
        maze[0][j] = maze[row+1][j] = 1;
    }

Position start,end;
    in>>i>>j;   //读入入口位置
    start.r=i; start.c=j;
    in>>i>>j;   //读入出口位置
    end.r=i; end.c=j;

//读入迷宫数据
    for (i=1;i<row+1;i++)
    {
        for (j=1;j<col+1;j++)
        {
            in>>maze[i][j];
        }
    }

stack<Position> path;
    list<Position> show;
    if (FindPath(start,end,path,maze))//找到一条路径
    {
        while (!path.empty())
        {
            show.push_front(path.top());//路径出栈
            path.pop();
        }

list<Position>::iterator it=show.begin();
        for (; it!=show.end(); it++)//显示路径
        {
            cout<<"("<<(*it).r<<" , "<<(*it).c<<")"<<endl;
        }
    }
    else//没有找到路径
    {
        cout<<"Not find any correct path!"<<endl;
    }

for (i=0; i<row+2; i++)//释放内存空间
    {
        delete []maze[i];
    }
    delete []maze;

return 0;
}

其中的文件结构为:第一行,迷宫的行(ROW)和列(COL)
                            第二行,迷宫的入口
                            第三行,迷宫的出口
                            第四行以后,迷宫数据,按行存储,每行COL个0或1,共ROW行
    文件中数据以空格或回车或table隔开。不能含有其它字符。因为未对数据进行检验,故无法识别数据结构错误。

这是一个迷宫文件: maze.dat,因为上传不支持.dat,所以需要将.txt后缀改为.dat。

转载于:https://www.cnblogs.com/chengy024/archive/2008/07/02/1234181.html

栈的应用——迷宫的非递归解法相关推荐

  1. (兔子繁殖问题)斐波那契数列:递归非递归解法

    题目 假设一对幼年兔子需要一个月长成成年兔子,一对成年兔子一个月后每个月都可以繁衍出一对新的幼年兔子.不考虑死亡的情况,问第 N 个月时共有多少对兔子? 这是一个典型的斐波那契数列问题,即 第一个月有 ...

  2. 如何快速理解递归——蓝桥杯 试题 基础练习 FJ的字符串(递归与非递归解法)——10行代码AC

    励志用少的代码做高效的表达. 注意点: 1.规律 2.非递归解法:string重载了+=运算符,因此用string会方便很多.并且string动态扩充,防浪费,更高效. 3.递归解法:官方的标签就是递 ...

  3. 变形二叉树中节点的最大距离(树的最长路径)——非递归解法

    问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...

  4. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

  5. C语言:Fibonacci数列的递归解法和非递归解法

    求Fibonacci数列的第n项(注意,是当n很小时) Fibonacci数列: F(n)=F(n-1)+F(n-2) 1 1 2 3 5 8 13 21 -- 递归解法: #include<s ...

  6. 迷宫的非递归求解 C语言 数据结构课程设计

    非递归求解迷宫问题 问题解决的实现 运行环境说明: 正常数据测试 有疑问看这里 源码及课程设计报告 更新一下以往的课程设计,希望能给相同课程设计的同学提供一个不一样的思路. 问题解决的实现 问题描述: ...

  7. 二叉树的前序中序后序 递归与非递归解法

    转自https://www.cnblogs.com/songwenjie/p/8955856.html 二叉树遍历原理 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点 ...

  8. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法

    python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...

  9. java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法

    题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...

最新文章

  1. mysql 3列索引_mysql多列索引
  2. rn webview加载本地静态html,RNwebview加载本地html.htm
  3. java的jps命令怎么使用_jps命令的使用方法
  4. 网络传输层之TCP、UDP详解
  5. 分数优先遵循志愿php源码_分数优先 遵循志愿
  6. SQL Server 2016完整数据库备份的演练
  7. php 个人中心常见界面,UI设计灵感:个人中心界面设计(User Profile)
  8. nps内网穿透_内网穿透工具:NPS的使用
  9. Windows10本地数据库搭建(MySQL、PostgreSQL)
  10. js基础-点击切换div背景颜色
  11. 短视频源码,自定义弹框的简单写法Demo
  12. cad化工设备绘图_auto cad在化工设备制图中的应用 ——致初学cad绘图者.ppt
  13. emmm最近写了 那个图论入门 找最短路径 Prim 适合比较稠密的图 Kru 适合边比较少的图
  14. 绝了,GitHub程序员的微服务资源库太强了,每份学习手册都优质详细
  15. 如何注册域名,获取个人网站网址
  16. 利用python处理pdf文本_Python用于NLP :处理文本和PDF文件
  17. ASP中Err.number返回的错误代码解释大全
  18. online-DDL详细原理介绍及gh-ost讲解
  19. Lighttools 闪光灯仿真自建实例
  20. 管理之黄金圈理论:让自己更值钱的5个能力

热门文章

  1. DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...
  2. 数据库:数据库优化(一)
  3. adb通信协议分析以及实现(二):adb服务进程发现设备
  4. 编排管理成容器云关键,Kubernetes和Swarm该选谁
  5. 详解Linux运维工程师打怪升级篇
  6. 这样写的博客才有更多的人愿意看
  7. SQL语句中的AND和OR执行顺序问题
  8. 2463: [中山市选2009]谁能赢呢? Codeforces Round #429 (Div. 2) B. Godsend noip三国游戏...
  9. ifdown eth0 idup eth0 ifdown --exclude=l0 -a ifup --exclude=lo -a
  10. Alibaba Dubbo框架同步调用原理分析-1