迷宫问题的解
#include<iostream>
using namespace std;
#include<string.h>
#define max1 100
typedef int datatype;
datatype node[max1][max1];//记录坐标是否走过
// 规定东南西北为右下左上
typedef struct
{
datatype map1[max1][max1];
int m,n;
}MAP;//迷宫的结构体
typedef struct
{
int x[max1];
int y[max1];
}NODE;//储存每一步经过的点的结构体
void createmap(MAP &p)
{
cout << "请输入迷宫的大小(n*m):" << endl;
cout << "n:";
cin >> p.n ; // 迷宫的宽
cout << "m:";
cin >> p.m; // 迷宫的长
cout << "请输入一个" << p.n << "*" << p.m << "的迷宫(1为障碍,0为通路,迷宫入口为(1,1),出口为(" << p.n << "," << p.m << ")):" << endl;
for(int i=1;i<=p.n;i++)
for(int j=1;j<=p.m;j++)
{
cin >> p.map1[i][j];// 设置通路和障碍
if(p.map1[i][j]>1)
p.map1[i][j]=1;// 如果障碍值大于1则重新赋值为1
}
}
int flag=0;// 记录解的个数
void disp(NODE &p,int n)
{
if(flag==1)
cout << "迷宫有解,解如下:" <<endl;
cout << flag << ":"; // 输出该解是第几个解
for(int i=0;i<=n;i++) // 打印路径
if(n!=i)
cout << "(" << p.x[i] << "," << p.y[i] << ")" << "->";
else
cout << "(" << p.x[i] << "," << p.y[i] << ")" << endl;
}
void dfs(MAP &p,int x,int y,NODE &q,int ans)
{
q.x[ans]=x;//记录当前步数的x坐标
q.y[ans]=y;//记录当前步数的y坐标
if(x==p.n&&y==p.m&&p.map1[x][y]==0)//判断是否到达出口
{
flag++;// 解的数目加一
disp(q,ans); // 调用函数打印路径
return;
}
if(y+1<=p.m&&node[x][y+1]==0&&p.map1[x][y+1]==0)//判断能不能向东走
{
node[x][y+1]=1;//标记走过的点的坐标
dfs(p,x,y+1,q,ans+1);// 递归将向东的下一个坐标作为一个新的向东的发散点
node[x][y+1]=0;// 当回溯时将走过的点的标记归零
}
if(x-1>=1&&node[x-1][y]==0&&p.map1[x-1][y]==0)//判断能不能向北走
{
node[x-1][y]=1;//标记走过的点的坐标
dfs(p,x-1,y,q,ans+1);// 递归将向北的下一个坐标作为一个新的向北的发散的点
node[x-1][y]=0;// 当回溯时将走过的点的标记归零
}
if(y-1>=1&&node[x][y-1]==0&&p.map1[x][y-1]==0)//判断能不能向西走
{
node[x][y-1]=1;//标记走过的点的坐标
dfs(p,x,y-1,q,ans+1);// 递归将向西的下一个坐标作为一个新的向西的发散的点
node[x][y-1]=0;// 当回溯时将走过的点的标记归零
}
if(x+1<=p.n&&node[x+1][y]==0&&p.map1[x+1][y]==0)//判断能不能向南走
{
node[x+1][y]=1;//标记走过的点的坐标
dfs(p,x+1,y,q,ans+1);// 递归将向南的下一个坐标作为一个新的向南的发散的点
node[x+1][y]=0;// 当回溯时将走过的点的标记归零
}
}
int main()
{
MAP p;
NODE q;
memset(node,0,sizeof(node));// 将标记数组初始化
createmap(p);// 调用创建迷宫的函数
node[1][1]=1;// 标记入口
dfs(p,1,1,q,0);// 以入口为发散的点开始遍历
if(flag==0)
cout << "该迷宫没有通路!" << endl;
return 0;
}
简单迷宫问题解法