最简单的迷宫求解

Posted Luella_G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最简单的迷宫求解相关的知识,希望对你有一定的参考价值。

在计算机中,我们可以把迷宫当做一个二维数组。其中0表示通路,1表示墙。

我们以下图为例,对于只有一条通路的简单迷宫进行求解

                   

该迷宫存储在“Map.txt”文档中。

对于该迷宫,我们首先将入口点压入栈中,然后通过对该点的上、右、下、左分别进行探测,找到合适的点前进,并将该点压入栈中。为了防止将已经走过的点再走一遍,我们需要对已走过的点进行赋值,将其赋为2.当点继续前进的时候很容易会进入到一个死胡同当中,即从这个点到其他点没有通路,我们需要运用到回溯法。回溯法就是将已将压栈的点进行出栈,为了区分那些点是不是经过了出栈,我们将那些出栈的点赋为3。运用回溯法我们可以测试之前的点还有没有其他的通路,依次查找。最终,我们就会找到迷宫的出口。

对于该迷宫的求解代码如下:

#include<iostream>
#include<assert.h>
#include<stack>

#pragma warning(disable:4996)

using namespace std;

const size_t N = 10;

void InitMap(int maze[][N], size_t n)

	FILE* map = fopen("Map.txt", "r");
	assert(map);

	for (size_t i = 0; i < n; ++i)
	
		for (size_t j = 0; j < n;)
		
			char ch = fgetc(map);
			if (ch == '0' || ch == '1')
			
				maze[i][j] = ch - '0';
				++j;
			
		
	


void PrintMap(int maze[][N], size_t n)

	for (size_t i = 0; i < n; ++i)
	
		for (size_t j = 0; j < n; ++j)
		
			cout << maze[i][j] << " ";
		
		cout << endl;
	
	cout << endl;



struct Pos

	size_t _row;
	size_t _col;
;

bool CheckWay(int maze[][N], size_t n, Pos& pos)

	if (maze[pos._row][pos._col] == 0)
	
		return true;
	
	else
	
		return false;
	


bool GetPath(int maze[][N], size_t n, Pos& entry)

	stack<Pos> path;
	path.push(entry);

	while (!path.empty())
	
		Pos cur = path.top();
		Pos next;
		maze[cur._row][cur._col] = 2;   //走过的节点标记为2
		if (cur._row == n - 1)   //最后一行为出口
		
			return true;
		
		
		//上
		next = cur;
		--next._row;
		if (CheckWay(maze, n, next))
		
			path.push(next);
			continue;
		

		//右
		next = cur;
		++next._col;
		if (CheckWay(maze, n, next))
		
			path.push(next);
			continue;
		

		//下
		next = cur;
		++next._row;
		if (CheckWay(maze, n, next))
		
			path.push(next);
			continue;
		

		//左
		next = cur;
		--next._col;
		if (CheckWay(maze, n, next))
		
			path.push(next);
			continue;
		

		//该点附近没有通路,使用回溯法
		Pos prev = path.top();
		maze[prev._row][prev._col] = 3;     //退回的标记为3
		path.pop();

	
	return false;


void TestMaze()

	int maze[N][N];
	InitMap(maze, N);
	PrintMap(maze, N);

	Pos entry;
	entry._row = 2;
	entry._col = 0;

	GetPath(maze, N, entry);
	PrintMap(maze, N);


int main()

	TestMaze();
	return 0;

这段代码的运行结果为:

               

我们可以很清晰的看到迷宫的解,并且我们能发现这个迷宫是如何求解的。

以上是关于最简单的迷宫求解的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之迷宫问题求解迷宫的最短路径

PHP树生成迷宫及A*自己主动寻路算法

转载用队列求解迷宫最短路径及其应用(围住神经猫)

如何打造多路无死角的“迷宫”?

BFS求解迷宫的最短路径问题

〔C++算法分析〕迷宫问题