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

具体怎么去思考呢?我们知道迷宫除了通路以外都是死路,死路的尽头一定是三面障碍,那么这个死路其实跟障碍也没什么区别,我们只需要去反复遍历整个迷宫直到堵完所有的死路,那么一定只会剩下通路。反复遍历是因为堵上三面障碍的死路尽头后,挨着它的路也变成了三面障碍,反复的次数视迷宫具体大小而定。在迷宫的边缘和起点终点这种没有四面的写特判。下面给出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的迷宫矩阵为例给出运行结果
可见岔路全部消失,输出结果就是迷宫的唯一通路。但无法给出路径,对于无环路的迷宫适用。