这里介绍的算法就是拿来找路的,对于带环路无法判断最短,只适用于单行列数字表示的迷宫,但是算法思路简单,用1表示路,0表示障碍,如

image.png

具体怎么去思考呢?我们知道迷宫除了通路以外都是死路,死路的尽头一定是三面障碍,那么这个死路其实跟障碍也没什么区别,我们只需要去反复遍历整个迷宫直到堵完所有的死路,那么一定只会剩下通路。反复遍历是因为堵上三面障碍的死路尽头后,挨着它的路也变成了三面障碍,反复的次数视迷宫具体大小而定。在迷宫的边缘和起点终点这种没有四面的写特判。下面给出c++代码(默认入口左上出口右下)

#include<iostream>
using namespace std;
void main(){
	int m,n;
	cin>>m>>n;
	int**maze=new int[m]
	for(int i=0;i<m;i++)
	maze[i]=new int[n];
	//构造动态数组存储迷宫
	int count=0,time=0;
	while(time<10){//反复堵死路
for(int i=0;i<6;i++){
		for(int j=0;j<10;j++){
			if(i>=1&&i<=m-2&&j>=1&&j<=n-2){
				if(board[i-1][j]==0)count++;
				if(board[i+1][j]==0)count++;
				if(board[i][j-1]==0)count++;
				if(board[i][j+1]==0)count++;
				if(count==3)board[i][j]=0;}
			//中间元素判定
			else if(i==0&&j>=1&&j<=n-2){
				if(board[i+1][j]==0)count++;
				if(board[i][j-1]==0)count++;
				if(board[i][j+1]==0)count++;
				if(count==2)board[i][j]=0;}
			//最上边中央判定
			else if(i==m-1&&j>=1&&j<=n-2){
				if(board[i-1][j]==0)count++;
				if(board[i][j-1]==0)count++;
				if(board[i][j+1]==0)count++;
				if(count==2)board[i][j]=0;}
			//最下边中央判定
			else if(j==0&&i>=1&&i<=m-2){
				if(board[i-1][j]==0)count++;
				if(board[i+1][j]==0)count++;
				if(board[i][j+1]==0)count++;
				if(count==2)board[i][j]=0;}
			//最左边中央判定
			else if(j==n-1&&i>=1&&i<=m-2){
				if(board[i-1][j]==0)count++;
				if(board[i+1][j]==0)count++;
				if(board[i][j-1]==0)count++;
				if(count==2)board[i][j]=0;}
			//最右边中央判定
			else if(i==m-1&&j==0){
				if(board[i-1][j]==0)count++;
				if(board[i][j+1]==0)count++;
				if(count==1)board[i][j]=0;}
			else if(i==0&&j==n-1){
				if(board[i+1][j]==0)count++;
				if(board[i][j-1]==0)count++;
				if(count==1)board[i][j]=0;}
			count=0;}}
			//左下右上判定
	time++;}
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cout<<maze[m][n]<<'\t';}
		cout<<endl;}//输出1代表的通路路径
}

以一个8x8的迷宫矩阵为例给出运行结果

可见岔路全部消失,输出结果就是迷宫的唯一通路。但无法给出路径,对于无环路的迷宫适用。


华科菜鸡计科学生