栈的应用——迷宫的非递归解法
下面是源码:
#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
栈的应用——迷宫的非递归解法相关推荐
- (兔子繁殖问题)斐波那契数列:递归非递归解法
题目 假设一对幼年兔子需要一个月长成成年兔子,一对成年兔子一个月后每个月都可以繁衍出一对新的幼年兔子.不考虑死亡的情况,问第 N 个月时共有多少对兔子? 这是一个典型的斐波那契数列问题,即 第一个月有 ...
- 如何快速理解递归——蓝桥杯 试题 基础练习 FJ的字符串(递归与非递归解法)——10行代码AC
励志用少的代码做高效的表达. 注意点: 1.规律 2.非递归解法:string重载了+=运算符,因此用string会方便很多.并且string动态扩充,防浪费,更高效. 3.递归解法:官方的标签就是递 ...
- 变形二叉树中节点的最大距离(树的最长路径)——非递归解法
问题描写叙述: 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的.我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.測试 ...
- python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...
汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...
- C语言:Fibonacci数列的递归解法和非递归解法
求Fibonacci数列的第n项(注意,是当n很小时) Fibonacci数列: F(n)=F(n-1)+F(n-2) 1 1 2 3 5 8 13 21 -- 递归解法: #include<s ...
- 迷宫的非递归求解 C语言 数据结构课程设计
非递归求解迷宫问题 问题解决的实现 运行环境说明: 正常数据测试 有疑问看这里 源码及课程设计报告 更新一下以往的课程设计,希望能给相同课程设计的同学提供一个不一样的思路. 问题解决的实现 问题描述: ...
- 二叉树的前序中序后序 递归与非递归解法
转自https://www.cnblogs.com/songwenjie/p/8955856.html 二叉树遍历原理 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点 ...
- 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法
python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...
- java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法
题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...
最新文章
- mysql 3列索引_mysql多列索引
- rn webview加载本地静态html,RNwebview加载本地html.htm
- java的jps命令怎么使用_jps命令的使用方法
- 网络传输层之TCP、UDP详解
- 分数优先遵循志愿php源码_分数优先 遵循志愿
- SQL Server 2016完整数据库备份的演练
- php 个人中心常见界面,UI设计灵感:个人中心界面设计(User Profile)
- nps内网穿透_内网穿透工具:NPS的使用
- Windows10本地数据库搭建(MySQL、PostgreSQL)
- js基础-点击切换div背景颜色
- 短视频源码,自定义弹框的简单写法Demo
- cad化工设备绘图_auto cad在化工设备制图中的应用 ——致初学cad绘图者.ppt
- emmm最近写了 那个图论入门 找最短路径 Prim 适合比较稠密的图 Kru 适合边比较少的图
- 绝了,GitHub程序员的微服务资源库太强了,每份学习手册都优质详细
- 如何注册域名,获取个人网站网址
- 利用python处理pdf文本_Python用于NLP :处理文本和PDF文件
- ASP中Err.number返回的错误代码解释大全
- online-DDL详细原理介绍及gh-ost讲解
- Lighttools 闪光灯仿真自建实例
- 管理之黄金圈理论:让自己更值钱的5个能力
热门文章
- DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...
- 数据库:数据库优化(一)
- adb通信协议分析以及实现(二):adb服务进程发现设备
- 编排管理成容器云关键,Kubernetes和Swarm该选谁
- 详解Linux运维工程师打怪升级篇
- 这样写的博客才有更多的人愿意看
- SQL语句中的AND和OR执行顺序问题
- 2463: [中山市选2009]谁能赢呢? Codeforces Round #429 (Div. 2) B. Godsend noip三国游戏...
- ifdown eth0 idup eth0 ifdown --exclude=l0 -a ifup --exclude=lo -a
- Alibaba Dubbo框架同步调用原理分析-1