ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构:迷宫问题 - 寻找迷宫路径两种方式

2020-01-25 17:38:04  阅读:346  来源: 互联网

标签:int 路径 迷宫 next entry Maze 数据结构 col row


迷宫问题是数据结构中的一个较为基本也是较为简单的问题,笔者在初学这门课时也是早早遇见了它,还是蛮有意思的,做出来的话确实给了我这种新人一点鼓励。

想法

我们小时候都玩过走迷宫,像我小时候就尤其喜欢奥特曼走迷宫【:)】。我们人脑在解决这种问题时,无外乎就是一条条的探,看那个走得通就走哪个,所以同样的,我们可以把这种思维方式模拟给计算机,让它也去尝试。当然不同的是,我们人脑有着直觉,有事可以一目十行的的看,而对于计算机,我们就需要严格的逻辑定义,让其考虑每一种可能。

基本原理

有了初步想法后,现在就来看大概实现。这个走迷宫,有点像贪吃蛇,上下左右探着走,当然,我们走迷宫,是可以返回的。依此,我们在找到了可行的通路后,将这一步所踩得点的标志位进行更改,重复这一步,若是死路则借助堆栈返回,从另一个方向开始此步骤。最终寻得最终通路,结果显示为一个二维矩阵(数组)。

代码实现

有两种实现方式,都借助了堆栈,一种是普通写法(频繁使用continue),另一种使用递归。
代码如下,注释应较为明晰。
欢迎与博主讨论。

//分别采用堆栈的方法和递归的方法对迷宫进行寻路

#include<iostream>
#include<stack>
using namespace std;

struct number   //结构体方法,包含行与列数据成员
{
	int row;
	int col;
};



void GetMaze(int* Maze, int N)  //获取迷宫信息
{
	
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			int value;
			cout << "Please enter this position's value(0 & 1) : ";
			cin >> value;
			Maze[i * N + j] = value;
		}
	}
}



bool checkPath(int*Maze,int n , number path)  //用于判断是否越界,同时判断该位置是否为0(0即通路)
{
	if ((path.row >= 0 && path.row < 10) && (path.col >= 0 && path.col < 10) && (Maze[path.row * n + path.col] == 0))
		return true;
	return false;
}

void GetMazePathByStack(int* Maze, int n, number entry, stack<number>& s)  //通过堆栈方式进行寻路
{
	number cur = entry;
	number next = cur;
	Maze[cur.row * n + cur.col] = 2;
	s.push(entry);
	while (!s.empty())
	{
		if (s.top().row == n - 1)
		{
			return;   //判断是否到达边界
		}
		//up
		next = s.top();
		next.row -= 1;
		if (checkPath(Maze, n, next))
		{
			s.push(next);
			Maze[next.row * n + next.col] = 2;   //寻找通路,找到则标记为2
			continue;
		}

		//right
		next = s.top();
		next.col+= 1;
		if (checkPath(Maze, n, next))
		{
			s.push(next);
			Maze[next.row * n + next.col] = 2;
			continue;
		}

		//down
		next = s.top();
		next.row += 1;
		if (checkPath(Maze, n, next))
		{
			s.push(next);
			Maze[next.row * n + next.col] = 2;
			continue;
		}

		//left
		next = s.top();
		next.col-= 1;
		if (checkPath(Maze, n, next))
		{
			s.push(next);
			Maze[next.row * n + next.col] = 2;
			continue;
		}

		number noway = s.top();
		Maze[noway.row * n + noway.col] = 3;
		s.pop();

	}
}

void GetMazePathByResursive(int* Maze, int n, number entry, stack<number>& s)  //递归法寻路
{
	number next = entry;
	Maze[next.row * n + next.col] = 2;
	s.push(entry);

	if (next.row == n - 1)
	{
		return;
	}
	//up
	next = entry;
	next.row -= 1;
	if (checkPath(Maze, n, next))
	{
		GetMazePathByResursive(Maze, n, next, s);
	}

	//right
	next = entry;
	next.col += 1;
	if (checkPath(Maze, n, next))
	{
		GetMazePathByResursive(Maze, n, next, s);
	}

	//down
	next = entry;
	next.row += 1;
	if (checkPath(Maze, n, next))
	{
		GetMazePathByResursive(Maze, n, next, s);
	}
	//left
	next = entry;
	next.col -= 1;
	if (checkPath(Maze, n, next))
	{
		GetMazePathByResursive(Maze, n, next, s);
	}
}

void printMaze(int* Maze, int n)    //打印出寻路后的迷宫
{
	cout << "The maze is : " << endl;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << Maze[i * n + j] << " ";
		}
		cout << endl;
	}
}

int main()
{
	
	int maze[100] = { 0 };
	int n;

	cout << "enter the number of the maze's col" << endl;
	cin >> n;
	GetMaze(maze,n);
	cout << "Find path by stack way" << endl;
	number start;
	start.row = 0;
	start.col = 0;
	stack<number>a;
	GetMazePathByStack(maze, n, start, a);
	printMaze(maze, n);


	stack<number>b;
	cout << "enter the number of the maze's col" << endl;
	cin >> n;
	GetMaze(maze, n);
	number begin;
	begin.col = 0;
	begin.row = 0;
	cout << "Find path by recursive way" << endl;
	GetMazePathByResursive(maze, n, begin, b);
	printMaze(maze, n);


	
}
富贵儿233 发布了5 篇原创文章 · 获赞 4 · 访问量 2728 私信 关注

标签:int,路径,迷宫,next,entry,Maze,数据结构,col,row
来源: https://blog.csdn.net/weixin_43960713/article/details/104083435

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有