栈求解迷宫问题

原创 2016年06月02日 10:45:25

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

    在给出代码之前先来看一下如何动态开辟一个二维数组?

int *a = new int[N*N];
int** a=new int*[N];
//a[i][j] 等价于 a[i*N + j];

    好了,现在来看迷宫的具体实现:

#define _CRT_SECURE_NO_WARNING
#pragma once
#include<iostream>
#include<stack>
#include<assert>
using namespace std;
#define N 10
struct Pos
{
	Pos(size_t row, size_t col)
		:_row(row)
		, _col(col)
	{}
	int _row;
	int _col;
};
void GetMaze(int *a,int n)//读入文件
{
	FILE* fout = fopen("MazeMap.txt", "r");
	assert(fout);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n;)
		{
			char ch = fgetc(fout);
			if ('0' == ch || '1' == ch)
			{
				a[i*n + j] = ch - '0';
				j++;
			}
			else
			{
				continue;
			}
		}
	}
	fclose(fout);
}
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;
	}
}
bool CheckIsAccess(int* a, int n, Pos next)
{
	assert(a);
	if ((next._row >= 0) && (next._row < n) && (next._col >= 0) && (next._col < n)&&(a[next._row*n+next._col]==0))
	{
		return true;
	}
	else
	{
		return false;
	}
}
bool MazePath(int* a, int n, const Pos& entry, stack<Pos>& path)
{
	Pos cur = entry;//入口位置
	path.push(cur);
	while (!path.empty())
	{
		//是否已经到出口
		if (cur._row == n - 1)
		{
			a[cur._row*n + cur._col] = 2;
			return true;
		}
		a[cur._row*n + cur._col] = 2;

		//*****************************************上
		Pos next = cur;
		next._row--;
		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;
		}

		//*****************************************右
		next = cur;
		next._col++;
		if (CheckIsAccess(a, n, next))
		{
			cur = next;
			path.push(cur);
			continue;
		}
		cur = path.top();//到这说明没有通路,所以栈顶出栈
		path.pop();
	}
	return false;
}
void TestMaze()
{
	int a[N][N] = {};
	GetMaze((int *)a,N);
	PrintMaze((int *)a, N);
	stack<Pos> path;
	Pos entry = { 2, 0 };
	bool ret = MazePath((int *)a, N, entry, path);
	cout << "是否有通路?" << ret << endl;
	PrintMaze((int *)a, N);
}

wKioL1cLmuvyQTNpAAAuTmotOqo431.png

当迷宫有多个出口时,利用全局栈可以求得最短路径。这个我们下次再议j_0063.gif

本文出自 “Stand out or Get out” 博客,请务必保留此出处http://jiazhenzhen.blog.51cto.com/10781724/1762752

栈求解迷宫问题

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

用栈和递归求解迷宫问题

一、问题概述 小时候,我们都玩过走迷宫的游戏吧。看一下这个图例: 遇到这种问题时,我们第一反应都会先找到迷宫的入口点,然后对上下左右四个方向进行寻迹,  检测当前位置是否是通路,是否可以...
  • xxpresent
  • xxpresent
  • 2016年11月30日 21:27
  • 2004

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

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

以栈解决迷宫问题

怎么找到一个迷宫的出口呢。首先要知道迷宫长啥样,之后知道出入口,再之后就是找通路的过程了。     显然主要的部分是如何找通路。我们就举一个例子:     在这个迷宫中0就是墙,1就是路...
  • A_stupid_dog
  • A_stupid_dog
  • 2016年06月23日 16:23
  • 3351

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

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

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

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

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

栈是数据结构中一种重要的线性结构,限定仅在表尾进行插入和删除操作的线性表,因此我们也可以认为它是一种特殊的线性表。由于栈的这个特点,我们又可以称其为后进先出的结构。如图所示:650) this.wid...
  • JulyShuofeng
  • JulyShuofeng
  • 2016年06月03日 13:15
  • 2846

C++栈实现数据结构中的迷宫求解

利用顺序栈实现数据结构中的迷宫求解问题 首先初始化一个二维数组vector>,将障碍物标记为-1,为走过的点标记为0,走过的点标记为1 从入口地址开始,依次按上下左右四个方向寻找是否有可以通行的点,如...
  • longjingwen12345
  • longjingwen12345
  • 2016年11月25日 12:47
  • 1325

利用堆栈实现迷宫问题的求解

的说法是
  • meiyubaihe
  • meiyubaihe
  • 2014年06月07日 10:47
  • 1329

迷宫求解【穷举求解法】

迷宫求解是一个理解数据结构中栈的比较好的实践例子,下面进行分析 设迷宫是又一个2维数组组成的,元素只有0或1来表示是否通路,0代表通路,1代表有墙壁不通路 例如下图中是一条通路 穷举法:从入口出发,...
  • u014644714
  • u014644714
  • 2016年11月23日 21:40
  • 692
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:栈求解迷宫问题
举报原因:
原因补充:

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