栈实现一个小迷宫

概括:实现迷宫的算法主要在于查找和回溯。从入口开始之后我们所查找的每一个位置都要去判断它的另外三个方向(不包括刚刚走过的路径)的路径能不能通,如果能通则到下个位置,并将上个位置进行标注。在将此位置作为当前位置继续走。如果一个位置的另外三个方向都不能通过,则需要回溯,一直回溯到可以通过的位置。我们需要将走过的路径进行标注,以便回溯的时候更加快捷。

首先我们从起始位置开始一直沿橙色路线走下去,将走过的路径标记为2,最后将会走入死胡同,然后沿着紫色的路径进行回溯知道有同路。

下面我们来看一下实现代码

bool MazePath(int* a,int n,const Pos& entry,stack<Pos>& path)
{
	Pos cur=entry;
	path.push(cur);
	while(!path.empty())
	{ 
		a[cur._row*n+cur._col]=2;
		if(cur._row==n-1)
		{
			return true;
		}
		else
		{
			//上
		    Pos next=cur;
		    next._row--;
		    if(CheckIsAccess(a,n,next))
			{
				cur=next;
				path.push(cur);
				continue;
			}
			右
			next=cur;
			next._col++;
			if(CheckIsAccess(a,n,next))
			{
				cur=next;
				path.push(cur);
				continue;
			}
			//下
			next=cur;
			next._row++;
			if(CheckIsAccess(a,n,next))
			{
				cur=next;
				path.push(cur);
				continue;
			}
			//左
			next=cur;
			next._col--;
			if(CheckIsAccess(a,n,next))
			{
				cur=next;
				path.push(cur);
				continue;
			}

		       cur=path.top();
			path.pop();
		}			

	}

此程序是通过压栈,和出栈来实现。首先我们来简单的了解一下栈,栈是只能从一个口进行pop与push,正是因为栈的这个特点,我们在走迷宫时可以将能走通的路径压入栈中,在进入死胡同的时候可以进行回溯只需要出栈就可以。

博主第一次写,写得不好的地方希望大家多多包涵

时间: 2024-10-09 11:42:01

栈实现一个小迷宫的相关文章

栈的简单应用-迷宫问题

                                             迷宫问题 迷宫问题一直是计算机工作者感兴趣的问题,因为它可以展现栈的巧妙应用, 这里将利用栈开发一个走迷宫程序,虽然在发现正确路径前,程序要尝试许多 错误路径,但是,一旦发现,就能够重新走出迷宫,而不会再去尝试任何错误路径. 迷宫问题求解 计算机中可以用如图所示的方块图表示迷宫.图中空白方块为通道,蓝色方块为墙 迷宫的储存可以使用二维数组,其中"0"代表墙值,"1"代表通路.由

每天一个小算法(6)---- 通过两个栈实现一个队列

这个算法也很简单,定义两个栈m_aStack.m_bStack,m_aStack负责push()数据,m_bStack负责front()数据. 思路:每一次front()取数据都会检查一下m_bStack是否为空,为空则把m_aStack的所有数据pop()出来push()到m_bStack中. 因为STL里有stack,直接拿来用了,代码使用C++,在linux/g++下编译运行成功: 1 #include <stack> 2 #include <stdio.h> 3 #incl

使用栈和队列实现迷宫路径查找算法

0 综述 最近,接到老板的一个小任务,即实现个迷宫路径查找小程序,要求使用栈和队列去实现.不敢怠慢,我赶紧打开Visual Studio 2012,同时在稿纸上笔画着.题目如下:使用栈及队列分别设计一个算法进行迷宫路径查找(用下列二维数组表示迷宫,1表示不可通过,0表示可以通过,左上角2为起点,右下角3为终点). 1. 栈实现 迷宫路径查找的关键点在于对分支点的处理,使用栈来存储分支点坐标的实现方法称之为深度搜索算法.对于初始矩阵,从初始点2开始搜索四个方向上的路径并分别对路径进行合理标记,然后

每天一个小算法(3)----倒序打印链表

这个比较简单,用栈.递归.倒转链表都可以实现,不再过多解释. 代码使用递归实现 1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 typedef struct Node 5 { 6 int data; 7 Node* next; 8 }Node, *List; 9 10 11 List createList(int num) //随机生成数字,构造链表 12 { 13 List aList

可能你不知道的字符串中的一个小坑!!!

简单的记录一个小问题,一直居然都没怎么注意,心底对自己深深的说了一句:"你真菜"! 平时日常我们接触到的数组去重太常见了.然后对于字符串的去重,也是可能用的IndexOf.或者转成数组去查重,然后再转换回来! 在尝试用其他方法的时候遇见一个小问题,在此记录下来与大家分析! var str = '521213756406'; for(var i = 0; i < str.length-1;i++){ for(var j = i+1;j < str.length; j++){

关于链表的一个小程序

关于链表的一个小程序: /**************************链表*****************************//* 具备功能 *//* 链表按元素位置插入 *//* 链表按元素位置删除 *//* 链表全表遍历 *//* 链表整表创建(头插法) *//* 链表整表创建(尾插法) *//* 链表整表删除 *//**************************链表*****************************/ #include<stdio.h>#in

使用两个栈实现一个队列

使用两个栈Stack1和Stack2来实现一个队列.其中一个栈作为主存放数据的,另外一个栈作为临时存放数据的栈.具体操作如下: enqueue: 栈Stack1的入栈操作. dequeue:将Stack1中的元素一个一个地全部依次出栈,并且在Stack1出栈的同时把出栈的元素作为参数对Stack2进行入栈操作.这步完成之后,执行Stack2出栈操作,这时就将原先在Stack1中最先入栈的元素弹出.最后再将Stack2中的元素一个一个地全部依次出栈,填到Stack1中. 实现代码如下: /** *

原创观点:还在认为企业或个人只能申请一个小程序吗?

今天第一次体验了整个小程序注册流程,使用的是我自己的这个简单的教程(个人无appid如何进行申请开发者权限,简单操作步骤),教程虽然是我的,我自己却没有真的实践过,真是误人子弟,自己也不一定能知道:今天亲自测试了一下:首先走完邮箱验证: 验证完毕后,开始进入信息登录,这里,有一些关键信息,是本文观点的主要支撑: 请输入管理员的身份证号码,一个身份证号码只能注册5个小程序. 然后填写完毕后,到了第二个关键点: 为了验证你的身份,请用绑定了管理员本人银行卡的微信扫描二维码. 这个点,透露了两个信息,

先做一个“小程序”——关于微信应用号的六大猜想

先做一个“小程序”——关于微信应用号的六大猜想 9月 21 日,苦等了9个多月的时间,应用号终于与我们见面了,命名为「小程序」. 01 为什么推出小程序? 考虑到小程序对整个APP市场的影响,毫无疑问会对现有的APP生态带来一定的冲击.但是,之所以推出小程序,最直接的原因可能是为了构建和扩充微信生态链,让微信更具开放性. 如我们所知,目前微信公众号分为三类: • 服务号,连接人和商品,目前很多电商企业,以及在微信端提供产品和服务的企业都用服务号. • 订阅号,微信官方的定位是阅读,连接人和资讯的