利用数据结构栈求解迷宫问题

本段程序主要利用数据结构栈的先进后出特点,实现回溯求解迷宫路径问题。

#include<iostream>
#include<stack>
using namespace std;
//坐标类
struct Point
{
	int x;
	int y;
};
//地图类
template<int A>
struct Map
{
	int (*p)[A];
	int row;//行数
	int col;//列数
};
//start起始点, end终止点
template<int A>
bool FindPath(Map<A> & map,Point & start,Point & end)
{
	//先给图的外围加上障碍
	for(int i = 0;i<=map.col;i++)
	{
		map.p[0][i] = map.p[map.row][i] = 1;
	}
	for(int i = 0;i<=map.row;i++)
	{
		map.p[i][0] = map.p[i][map.col] = 1;
	}

	//用于保存路径的栈
	stack<Point> stackpath;
	//用于方向选择的偏移量数组   按照顺时针的方向
	Point offset[4];
	offset[0].x = 0; offset[0].y = 1;//向右
	offset[1].x = 1; offset[1].y = 0;//向下
	offset[2].x = 0; offset[2].y = -1;//向左
	offset[3].x = -1; offset[3].y = 0;//向上

	//将起点初始化为障碍点
	map.p[start.x][start.y] = 1;
	//起点入栈
	stackpath.push(start);
	//用于下一步方向选择的变量
	int option = 0;
	//下一步的最大选择变量
	int MaxOption = 3;
	//
	while((start.x != end.x)||(start.y != end.y))
	{
	 //选择下一步
		  while(option<=MaxOption)
		 {
			int x =  start.x + offset[option].x;
			int y =  start.y + offset[option].y;
			 if(map.p[x][y]!=1)
			 {
				 start.x = x;
				 start.y = y;
				 break;
			 }
			 option++;
		 }
		  //如找到了下一点
		  if(option<=MaxOption)
		  {
		   //入栈
		   stackpath.push(start);
		   //设置障碍
		   map.p[start.x][start.y] = 1;
		   option = 0;
		  }
		  else//没找到了下一点
		  {
			  //向后退一步,出栈
			  stackpath.pop();

			  //消除入栈时设置的障碍
			  map.p[start.x][start.y] = 0;
			  if(stackpath.empty())
			  {
				  return false;
			  }
			  //设置回溯后的option
			  if(start.x == stackpath.top().x)
			  {
				  if((start.y - stackpath.top().y)==1)//向右
				  {
					   option = 0;
				  }
				  if((start.y - stackpath.top().y)==-1)//向左
				  {
					   option = 2;
				  }
			  }
			  if(start.y == stackpath.top().y)
			  {

				  if((start.x - stackpath.top().x)==1)//向下
				  {
				      option = 1;
				  }
				   if((start.x - stackpath.top().x)==-1)//向上
				  {
				      option = 3;
				  }
			  }
			  option++;
			  start.x = stackpath.top().x;
			  start.y = stackpath.top().y;
		  }
	}
	//找到路径,并输出stackpath
	while(!stackpath.empty())
	{
		cout<<"<"<<stackpath.top().x<<","<<stackpath.top().y<<">"<<endl;
		stackpath.pop();
	}
	return true;
}

int main()
{
	//建立迷宫
	Map<10> map;
	map.col = map.row = 9;
	int p[10][10];
	for(int i =0;i<10;i++)//初始化迷宫
	{
	 for(int j=0;j<10;j++)
	 {
		 p[i][j] = 0;
	 }
	}
	//为迷宫设置障碍
	p[1][3] = 1;p[1][7] = 1;p[2][3] = 1;p[2][7] = 1;
	p[3][5] = 1;p[3][6] = 1;p[4][2] = 1;p[4][3] = 1;
	p[4][4] = 1;p[5][4] = 1;p[6][2] = 1;p[6][6] = 1;
	p[7][2] = 1;p[7][3] = 1;p[7][4] = 1;p[7][6] = 1;
	p[8][1] = 1;
	map.p = p;
	Point start,end;
	start.x = start.y = 1;
	end.x =8,end.y = 8;
	if(!FindPath<10>(map,start,end))
	{
	  cout<<"该迷宫无解!"<<endl;
	}
}

利用数据结构栈求解迷宫问题

时间: 2024-10-03 13:40:04

利用数据结构栈求解迷宫问题的相关文章

利用栈求解迷宫问题

利用栈求解迷宫问题 源代码: #include<stdio.h> #include<stdlib.h> #define M 8 #define N 8 #define MaxSize M*N typedef struct { int i;//当前方块的行号 int j;//当前方块的列号 int di; //di是下一个可走的相邻方块的方位号 }Box; typedef struct { Box data[MaxSize]; int top;      //栈顶指针 }StType

栈求解迷宫问题

求迷宫从入口到出口的所有路径是一个经典的程序设计问题.一般的设计思想就是从入口出发,顺着某个方向向下探索,探索分为上下左右四个方位,哪个方向是通的就将向下走,如果每个方向都走不下去就进行原路"回退".所以需要一个后进先出的结构来保存从入口到出口的路径.所以运用栈来实现是非常方便的,沿着某个方向走,将每个可通的位置进行入栈标记,再切换到下个位置:如果都不通,则栈顶出栈取消标记,再寻找.下来呢就实现一个简单的迷宫求解问题(求解出一条通路就好),至于求解多条通路并且求出最短路径的问题呢我还在

数据结构--书上代码用栈求解迷宫问题存在BUG(非最优解)

数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦. BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点,如果从(1,1)点开始判断如图那么它的右(1,2)下(2,1)都是可走点那么将右边的格子坐标进栈呢还是将下边的格子坐标进栈?书本上给的代码是先判断上边格子再判断右边格子再判断下边格子再判断左边格子,这就造成了一个问题:(1,2)则个点会被进栈(因为(1,2)点位于(1,1)点的右边被先判断进栈),

【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码

问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界平行.迷宫的入口在左上角,出口在右下角. 问题分析 首先要有一张迷宫地图,地图由两部分组成: (1)一是迷宫中各处的位置坐标, (2)二是迷宫各位置处的状态信息,即该处是墙还是路 所以,该迷宫地图可由一个二维数组来表示.数组的横纵坐标表示迷宫各处的位置坐标,数组元素表示各位置处的状态信息. 2.在这

应用栈求解迷宫问题(C++实现)

栈是数据结构中一种重要的线性结构,限定仅在表尾进行插入和删除操作的线性表,因此我们也可以认为它是一种特殊的线性表.由于栈的这个特点,我们又可以称其为后进先出的结构.如图所示: 由于栈具有后进先出的性质我们可以利用,是程序设计中一个有用的工具.利用栈我们可以来实现数制转换.后缀表达式求值.迷宫求解等等.在书本上我们可以看到用C语言实现的简单思路,但是程序仍旧存在许多bug.今天,我想尝试用强大的C++来实现. 迷宫问题的求解思路大致则是从入口出发,顺着某一方向向前探索,若能走通,则继续向前探索:若

C++表达式求值(利用数据结构栈)

唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的表 达式)的简单计算器程序.刚把两个程序对照了一下.感触还是挺深的,同一时候也再一次体现了数据结构在程序设计 中的重要性. 曾经的那个程序有漏洞并且逻辑复杂,所以就不提了,仅仅说说如今改进后的程序,其思想主要是用到了 栈先进后出的数据结构.在该程序中建有两个栈:一个用于存储运算符,还有一个用于存储操

利用栈实现迷宫求解

利用栈实现迷宫求解 前言:众所周知,栈是(First in last out)先进后出的数据结构,利用这个属性可以实现类似与回溯的方式,比如当前数据满足条件,则入栈,否则出栈返回上一级,依次循环. 在本题中,将每个迷宫路径上的点封装成上下左右四个方向数节点,先入栈迷宫入口节点,如果上下左右没被使用,则将其上下左右的点入栈,否则出栈.如果最终达到迷宫终点则成功,否则失败. 如下是每个节点的数据结构 1 typedef struct{ 2 int top; 3 int bottom; 4 int l

数据结构应用:利用栈破解迷宫游戏

最近刚开始学数据结构,发现数据结构真是个神奇的东西哈,很多现实中的问题都可以用不同的数据结 构来解决,比如利用和栈中缀表达式编写一个计算机程序,利用栈破解迷宫游戏,今天我就来跟大家分 享一下如何利用栈来破解迷宫游戏. 学过数据结构的人都知道,栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.如下图: 而我们在破解迷宫游戏的时候采用的方法是"回溯",也就是在寻找通路的时候,每找到一个通路,就将这个数据

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io