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

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

想法

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

基本原理

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

代码实现

有两种实现方式,都借助了堆栈,一种是普通写法(频繁使用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 私信 关注
上一篇:[CodeForces][思维]NEKO's Maze Game


下一篇:Codeforces Round #614 (Div. 2)C - NEKO's Maze Game