用栈实现迷宫游戏寻路

原创 2016年05月30日 13:35:25

    在我们学习数据结构的时候都曾经见过迷宫游戏,迷宫游戏的实现其实并不难,但是,我们在实现每一个算法的时候都应该想一想这个问题的每一个解。最近,博主已经开始重温数据结构啦,记得我们以前学习这里的时候,老师会用队列来实现迷宫最优解的寻找,氮素呢,博主就是这么可爱,博主就是想试试用栈来找一下。

    在实现之前让我们先来复习一下栈的特点:first in last out

    对于栈这种数据结构我们只能在栈顶对其操作,根据实际情况可将其实现成链式或者顺序结构。但是一般情况下我们都会实现成顺序结构,因为栈的特点导致了顺序结构管理方便,并且CPU缓存利用率更高。下面我们来简单的讲解一下迷宫小游戏

     为了避免用户操作的不便性,我们选择将迷宫提前写好放在一个叫做"Maze.h"的文件中

 

wKioL1cKG7ThltAWAAAbMDW4B8g037.png

*第一行的两个数字是迷宫的行和列

    我们解决迷宫寻路问题的基本思想是回溯。回溯是什么意思呢? 就是说,找不到就回退的思想。今天我们的程序要解决的问题是寻找最优解,所以,迷宫的每一条路我们都要去走一遍,这样,我们才能找到最短的那条路。

我们先来看一下程序是怎么写的(如果喷,请轻点j_0030.gif

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<cassert>
#include<iostream>
#include<fstream>
#include<stack>
using namespace std;
struct Pos
{
	size_t _x;
	size_t _y;
	Pos(size_t x, size_t y) :_x(x), _y(y)
	{}
};
stack<Pos> min;
bool IsValid(int *a, Pos cur, size_t R, size_t C)
{
	if ((a[cur._x*C + cur._y] == 0) && (cur._x < R) && (cur._y < C))
		return true;
	else
		return false;
}
void PrintMap(int *Map, size_t m, size_t n)
{
	for (size_t i = 0; i < m; i++)
	{
		for (size_t j = 0; j < n; j++)
		{
			std::cout << Map[i*n + j] << " ";
		}
		std::cout << std::endl;
	}
}
void GetMaze(int *a,size_t Row,size_t Col,std::ifstream& fout)
{
	size_t ch = 0;

	for (size_t i = 0; i < Row; i++)
	{
		for (size_t j = 0; j < Col;)
		{
			ch = fout.get()-'0';
			if (ch == 0 || ch == 1)
			{
				a[i*Col + j] = ch;
				j++;
			}
			else
				continue;
		}
	}
	PrintMap(a, Row, Col);
}
bool Check(int *a,Pos entry,int R,int C)
{
	Pos Up = entry;
	Pos Down = entry;
	Pos Left = entry;
	Pos Right = entry;

	Down._x++;
	Right._y++;
	Up._x--;
	Left._y--;
	if (IsValid(a, Down, R, C) || IsValid(a, Up, R, C) || 
		IsValid(a, Left, R, C) || IsValid(a, Right, R, C))
		return true;
	else
		return false;
}
bool GamePlay(int *a, Pos entry, size_t R, size_t C)
{
	assert(a);
	stack<Pos> s1;
	Pos man = entry;
	Pos next = man;
	Pos cur = entry;
	while ( 1 )
	{
		if (!Check(a, man, R, C))
		{
			cout << "最佳路径长度:";
			cout << min.size() << endl;
			return true;
		}
		s1.push(man);
		while (!s1.empty())
		{
			a[man._x*C + man._y] = 2;
			if (man._x == (R - 1) || man._y == (C - 1))
			{
				cout << "Find&end" << endl;
				if ((s1.size() < min.size()) || min.size() == 0)
					min = s1;
				while (!s1.empty())
				{
					cur = s1.top();
					s1.pop();
					if (Check(a, cur, R, C))
					{
						man = cur;
						break;
					}
				}
				if (s1.empty())
				{
					cout << "最佳路径长度:";
					cout << min.size() << endl;
					return true;
				}
			}
			
			//********************************************下
			next = man;
			next._x++;
			if (IsValid(a, next, R, C))
			{
				s1.push(man);
				man = next;
				continue;
			}
			//********************************************右
			next = man;
			next._y++;
			if (IsValid(a, next, R, C))
			{
				s1.push(man);
				man = next;
				continue;
			}
			//********************************************左
			next = man;
			next._y--;
			if (IsValid(a, next, R, C))
			{
				s1.push(man);
				man = next;
				continue;
			}
			//********************************************上
			next._x--;
			if (IsValid(a, next, R, C))
			{
				s1.push(man);
				man = next;
				continue;
			}
			else
			{
				man = s1.top();
				s1.pop();
			}
		}
		man = entry;
	}
}
void GameTest()
{
	//**********************从文件读入迷宫大小**********************
	ifstream fout("Maze.txt");
	stack<int> s1;
	int Row = 0;
	int Col = 0;
	char ch = fout.get();
	while (ch != ' ')
	{
		int tmp = ch - '0';
		s1.push(tmp);
		ch = fout.get();
	}
	int c = 0;
	while (!s1.empty())
	{
		Row += s1.top()*(int)pow(10, c);
		s1.pop();
		c++;
	}
	ch = fout.get();
	while (ch != ' '&&ch != '\n')
	{
		int tmp = ch - '0';
		s1.push(tmp);
		ch = fout.get();
	}
	c = 0;
	while (!s1.empty())
	{
		Col += (int)s1.top()*(int)pow(10, c);
		s1.pop();
		c++;
	}
	int *a = new int[Row*Col];
	//********************************************************

	Pos entry(0, 1);
	cout << endl << "***********    Map    **********" << endl;
	GetMaze(a, Row, Col, fout);
	GamePlay(a, entry, Row, Col);
	cout << endl << "***********    Map    **********" << endl;
	PrintMap(a, Row, Col);
	fout.close();
}

 **记得在打开文件的时候做异常处理哦。博主在这里就不改了,小伙伴们自己看看

    上面的代码呢,其实写的非常的不好,尤其是在代码复用的方面,不过,博主今天只是来举个栗子,今后会更加注意,你们也要注意哦,上面是个反面教材j_0084.gif(请理解一个看见自己代码想吐的我)


 解法详解:用一个全局的栈结构来存储最优路径 min

           用一个局部的站结构来存储当前一次得出的路径 s1

           每一步都需要判断上下左右四个方向是否可走

           ***注意:每次判断时将next的值先赋成当前的位置再进行加减否则产生副作用

           两层循环:里面一层即当前一次寻路完成

           外面一层即再也无路可循时我们获得了最优解

**嗯,再看一眼仍然觉得这个代码看得我辣眼睛(捂脸)。

请围观群众不吝赐教哦~



本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1762377

版权声明:本文为博主原创文章,未经博主允许不得转载。

迷宫游戏 用栈实现

#include #include #include using namespace std; #define n 8 stack s; int * createMaze(){//初始化迷宫 ...
  • u011700203
  • u011700203
  • 2014年05月13日 00:49
  • 1018

用栈实现简单的迷宫游戏

迷宫游戏的实现是运用了栈的“后进先出”的原理,究竟如何实现的呢?下来简单的分析一下。 比如:下图是一个小迷宫 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0...
  • qq_29503203
  • qq_29503203
  • 2016年09月10日 16:07
  • 482

【数据结构】栈实现迷宫寻路问题

思路: 解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。为了保证在任何位置上都能沿原路退回,所以需要用...
  • shangguan_1234
  • shangguan_1234
  • 2016年09月11日 22:07
  • 876

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

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

遗传算法解决迷宫寻路问题(Java实现)

1.什么是遗传算法? 就个人理解,遗传算法是模拟神奇的大自然中生物“优胜劣汰”原则指导下的进化过程,好的基因有更多的机会得到繁衍,这样一来,随着繁衍的进行,生物种群会朝着一个趋势收敛。而生物繁衍过程...
  • mynameis121
  • mynameis121
  • 2017年06月18日 17:14
  • 617

使用栈的迷宫算法java版

主要考察 栈 的使用主要思路如下: do { if(当前位置可通过) { 标记此位置已走过; 保存当前位置并入栈; if(当前位置为终点) { ...
  • Young_Leez
  • Young_Leez
  • 2015年03月02日 23:23
  • 1771

以栈解决迷宫问题

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

用栈和递归求解迷宫问题

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

栈求解迷宫问题

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

探索小游戏(三):A*算法实现自动寻路

关于A*算法,推荐一篇博客: 这里写链接内容博客中介绍了A*算法的原理,通过这个探索小游戏实现自动寻路,结合代码加深对A*算法的理解。首先定义了一个Point类:local Point = clas...
  • forestsenlin
  • forestsenlin
  • 2016年03月30日 21:00
  • 2191
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用栈实现迷宫游戏寻路
举报原因:
原因补充:

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