`
1641606815
  • 浏览: 39682 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

自定义栈实现迷宫求解(C++版)

阅读更多

                                                           迷宫求解

一:迷宫求解是一个锻炼我们的算法求解能力的问题,它的实现方法有很多;今天我们就介绍其中的用栈求解的方法。

二:什么是栈:

      大家应该都有往袋子里装东西的经历,在往袋子里装满东西之后,当我们去取的时候,总是先从最后放进去的东西的地方去取。也就是后进先出(FILO)。虽然栈的单向性用起来会没有链表那样可以在任意位置对数据进行操作,但是正因为如此栈也带来了很大的方便。

三:迷宫求解

现在我们要在下面的迷宫寻找一条可行的路径

 

1 1 1 1 1 1 1 1 1 1

1 0 0 1 1 0 0 0 0 1

1 0 0 0 1 0 1 0 0 1

1 0 1 0 0 0 1 1 0 1

1 0 1 0 0 0 1 1 1 1

1 0 1 1 1 0 1 1 1 1

1 0 1 1 1 0 1 1 1 1

1 1 1 1 1 0 0 0 1 1

1 1 1 1 1 1 1 0 0 1

1 1 1 1 1 1 1 1 1 1

首先我们需要在程序中表示上面的迷宫,该问题可以用数组实现

1:栈的定义

 

/************************************************************************/
/*自定义栈                                                                         */
/*通过自定义的简单栈以满足迷宫求解                */
/*功能:push() 将元素加入栈中                                  */
/*               pop() 退栈;topValue() 获得栈顶元素        */
/*				  clear() 清除栈 length() 获得栈中元素个数*/
/************************************************************************/
#include <stack>
#include <iostream>
using namespace std;

template<typename Elem> class PathStack: public stack<Elem>
{
private:
	int size;
	int top;
	Elem* listArray;
public:
	PathStack(int sz = DefaultListSize){
		size = sz;
		top = 0;
		listArray = new Elem[sz];
	}
	~PathStack(){ delete []listArray; }
	void clear(){ top = 0; }
	/****向栈中加入元素****/
	bool push(const Elem& item);
	/***********退栈**********/
	Elem pop();
	/********获得栈顶元素*******/
	Elem topValue() const;
	int length() const { return top; }
};

template<typename Elem>
bool PathStack<typename Elem>::push(const Elem& item){
	if(top == size) return false;
	listArray[top++] = item;
	return true;
}

template<typename Elem>
Elem PathStack<typename Elem>::pop(){
	Elem it;
	if(top == 0) return it;
	it = listArray[--top]; 
	return it;
}

template<typename Elem>
Elem PathStack<typename Elem>::topValue() const{
	Elem it;
	if(top == 0) return it;
	it = listArray[top - 1];
	return it;
}

 

 2:如何实现路径的寻找

     1:设定寻找的方向,可以使用一个判断语句;判断起始位置周围哪个地方有路就将该位置的坐标加入到栈中,并将该位置标记(将改位置值改为2,既将走过的位置标记为2)

     2:判断该位置周围是否还有路,若没有则退栈即退回到上一个位置;并将该位置做下另一个标记(将该位置值改为3,既将退栈位置值用3标记)

     3:重复1,2步骤直到达到出口

     路径寻找的类

 

//迷宫求解的方法类
//功能:通过findPath() 方法实现对路径的查找
//              通过printPath()方法将路径打印出来
#include "PathStack.h"
#include <iostream>
using namespace std;

class MazeSolveMethod
{
private:
	static int maze[10][10];//存放迷宫数据
	PathStack<int> pathStack;//定义栈
public:
	MazeSolveMethod():pathStack(100){
	}
	~MazeSolveMethod(){ }
	void findPath(int startX,int startY);
	void printPath() const;
};

int MazeSolveMethod::maze[10][10] = {
	{1,1,1,1,1,1,1,1,1,1},
	{1,0,0,1,1,0,0,0,0,1},
	{1,0,0,0,1,0,1,0,0,1},
	{1,0,1,0,0,0,1,1,0,1},
	{1,0,1,0,0,0,1,1,1,1},
	{1,0,1,1,1,0,1,1,1,1},
	{1,0,1,1,1,0,1,1,1,1},
	{1,1,1,1,1,0,0,0,1,1},
	{1,1,1,1,1,1,1,0,0,1},
	{1,1,1,1,1,1,1,1,1,1},
};

void MazeSolveMethod::findPath(int startX,int startY){
	int x = startX;
	int y = startY;
	pathStack.push(x);
	pathStack.push(y);
	maze[x][y] = 2;
	cout<<"进入方法!"<<endl;
	while(true){
		if(maze[x-1][y] == 0){
			pathStack.push(--x);
			pathStack.push(y);
			maze[x][y] = 2;
		}else if(maze[x][y-1] == 0){
			pathStack.push(x);
			pathStack.push(--y);
			maze[x][y] = 2;
		}else if(maze[x][y+1] == 0){
			pathStack.push(x);
			pathStack.push(++y);
			maze[x][y] = 2;
		}else if(maze[x+1][y] == 0){
			pathStack.push(++x);
			pathStack.push(y);
			maze[x][y] = 2;
		}
		if(maze[x-1][y] != 0 && maze[x][y+1] != 0 && maze[x+1][y] != 0 && maze[x][y-1] != 0){				
			if(x >= 8 && y >= 8){
				break;
			}else{
				maze[x][y] = 3;
				y = pathStack.pop();
				x = pathStack.pop();
			}
			y = pathStack.topValue();
			int temp = pathStack.pop();
			x = pathStack.topValue();
			pathStack.push(temp);
		}
	}
}

void MazeSolveMethod::printPath() const{
	cout<<"printPath"<<endl;
	for(int i=0; i<10; i++){
		for(int j=0; j<10; j++){
			if(maze[i][j] == 2)
				cout<<'*'<<"  ";
			else if(maze[i][j] == 3)
				cout<<0<<"  ";
			else
				cout<<1<<"  ";
		}
		cout<<endl;
	}
}

   主函数类

 

/************************************************************************/
/*迷宫求解----栈方法实现*/
//功能:通过对栈实现迷宫算法求解
//Author:Andrew
//Date   :2012-10-20
/************************************************************************/
#include "MazeSolveMethod.h"
#include <iostream>
using std::cout;
using std::endl;

int main(){

	MazeSolveMethod solve;
	solve.findPath(1,1);
	solve.printPath();
	system("pause");
	return 0;
}

 将上面的代码运行后结果截图如下:

 其中* 为路径

 


 

 

  • 大小: 18.8 KB
1
4
分享到:
评论

相关推荐

    C++ 自定义栈实现迷宫求解

    "C++ 自定义栈实现迷宫求解" C++ 自定义栈实现迷宫求解是一种常见的算法问题,通过自定义栈来实现迷宫的求解。下面我们将详细介绍该问题的知识点。 一、什么是栈? 栈是一种数据结构,它具有先进后出的特性(FILO)...

    用C++实现的迷宫,非递归,自定义栈

    本项目是用C++语言实现的迷宫求解算法,且采用了非递归方式,并利用自定义栈来辅助解决。这样的设计既避免了递归带来的额外开销,也使得程序结构更加清晰,易于理解和调试。 首先,我们要理解迷宫问题的基本概念。...

    迷宫求解C++源代码(回溯法)

    标题 "迷宫求解C++源代码(回溯法)" 涉及到的核心知识点是计算机算法中的迷宫求解问题以及编程语言C++的应用,特别是使用回溯法来解决此类问题。回溯法是一种试探性的解决问题的方法,它尝试分步地找到问题的解,...

    链表栈实现迷宫算法VC平台

    在链表栈中,我们可以使用DFS来实现迷宫的求解。DFS的基本思想是从起点开始,每次尝试走一步,如果走到终点则找到路径,如果走入死胡同则回溯至上一步,继续探索其他可能的路径。在VC++中,可以结合链表栈记录当前...

    maze、迷宫求解VC++对话框实现

    总之,"maze、迷宫求解VC++对话框实现"是一个综合性的编程实践项目,不仅涉及到基本的C++编程,还涵盖了图形用户界面设计、数据结构和算法应用等多个重要知识点。通过这个项目,开发者可以提升自己的编程技巧和问题...

    数据结构习题迷宫求解程序

    本项目以“数据结构习题迷宫求解程序”为主题,采用C++编程语言,利用MFC(Microsoft Foundation Classes)库进行图形用户界面的开发,旨在实现迷宫的自定义设定及可视化求解过程。本文将详细介绍这一项目的实现原理...

    迷宫求解MFC

    总之,通过MFC实现迷宫问题的求解,既锻炼了对C++面向对象编程的理解,又掌握了图形界面设计和经典算法的应用。在这个过程中,你需要熟悉MFC框架,理解图遍历算法,并具备一定的图形界面编程经验。这是一个很好的...

    迷宫问题的C++实现源代码

    在"迷宫求解.cpp"文件中,源代码可能会包含以下关键部分: 1. 定义迷宫的二维数组和起始、结束点。 2. 实现DFS函数,使用递归和栈来探索路径。 3. 实现BFS函数,使用队列来存储待访问节点。 4. 主函数中读取迷宫...

    迷宫课程设计报告

    在这个课程设计中,学生被要求使用C或C++编程语言来实现迷宫问题的解决方案。迷宫被表示为一个m行n列的二维数组,其中0代表无障碍路径,1代表墙壁或障碍物。起点设为(1,1),终点为(m,n)。任务是设计一个算法,...

    C++课程设计 迷宫

    这个迷宫求解的算法可能是基于深度优先搜索,因为它倾向于先探索一条路径直到尽头再回溯。然而,由于代码片段不完整,具体实现细节(如回溯和路径恢复)没有给出。完整的解决方案还需要包括如何判断和回溯,以及如何...

    C++语言编制一个求解迷宫通路的程序

    通过以上步骤,我们可以用C++编写一个求解迷宫通路的程序,实现从给定的起点到终点的路径搜索。这个程序不仅展示了基本的回溯法应用,还涉及到数据结构和算法设计,对学习C++编程和算法有很好的实践意义。

    迷宫问题求解、迷宫问题非递归求解

    - `Stack`类作为自定义的顺序栈,包含压栈(Push)、弹栈(Pop)等方法。 - `maze`类包含了处理迷宫的主要功能,如创建迷宫、查找路径和打印路径。 在`maze.cpp`中,实现各个成员函数,例如: - `print()`函数用于输出...

    走迷宫实现程序.rar

    在这个项目中,"MyStack.cpp" 文件可能包含了自定义栈类的实现,用于存储迷宫中的移动历史,以便于回溯寻找可行路径。栈操作如push(入栈)和pop(出栈)将用于模拟在迷宫中移动并记录行走轨迹。 "C++ 游戏"标签...

    (精品)迷宫问题的C-C++算法实现.doc

    主函数`_tmain`中,用户输入迷宫的尺寸,生成二维数组和存储路径的动态数组,然后执行迷宫求解过程。找到路径后,将栈中存储的坐标倒序输出,形成完整的路径。 在实际编程中,可能还需要考虑优化,例如使用位运算来...

    迷宫问题 假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为(m,n),试找出一条从入口通往出口的最短路径。设计算法并编程输出一条通过迷宫的最短路径或报告一个“无法通过”的信息。

    - 用户可以自定义迷宫布局,使用1和0表示墙壁和通道。 - 入口和出口位置可由用户指定。 - 程序应提供构造迷宫、输出迷宫、寻找最短路径和打印路径的功能。 2. **概要设计**: - 定义一个栈 ADT Stack,包括初始...

    迷宫 最短路径及所有路径的问题

    【迷宫最短路径及所有路径...总之,这个程序提供了一个基础的迷宫求解框架,通过栈实现了从起点到终点的所有路径的搜索,并能找出其中的最短路径。对于初学者来说,这是一个很好的学习迷宫问题解决策略和栈操作的例子。

    c语言支持自己创建迷宫,并求解最短路径.zip

    在C语言中创建一个自定义迷宫并求解最短路径是一个典型的算法问题,它可以用于学习数据结构、图论和搜索算法。这个编程小案例涵盖了以下几个重要的知识点: 1. **字符数组与二维数组**:在C语言中,构建迷宫通常...

    迷宫程序设计报告

    本报告将详细阐述一个基于C++和VisualC++6.0开发的迷宫求解程序,该程序实现了自动寻找迷宫路径的功能,并且具有人性化的界面可视化效果。以下是对程序各个方面的详细介绍: 1. **寻找路径**: 程序的核心算法是...

Global site tag (gtag.js) - Google Analytics