迷宫问题

迷宫问题

#include
using namespace std;
int v[100][100]={0};//初始化用来标记走过的点
typedef struct
{
int edg[100][100];
int m,n;
}map;//迷宫矩阵
typedef struct
{
int x[100];
int y[100];
}vis;//储存每一步的点
void create(map &p)//创建迷宫
{
cout<<“请输入迷宫大小(nm)"<<endl;
cout<<“n:”;cin>>p.n;//输入迷宫宽度
cout<<“m:”;cin>>p.m;//输入迷宫长度
cout<<"请输入一个(n
m)的迷宫,起点(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.edg[i][j];
if(p.edg[i][j]>1)
p.edg[i][j]=1;
}
}
int cont=0;//记下迷宫解数
void dis(vis &p,int n)
{
if(cont1)
cout<<“该迷宫有解:”<<endl;
cout<<“第”<<cont<<“个解:”;//打印这是第几个解
for(int i=0;i<=n;i++)
{
if(i!=n)
cout<<"("<<p.x[i]<<","<<p.y[i]<<")"<<"->";
else
cout<<"("<<p.x[i]<<","<<p.y[i]<<")"<<endl;
}
}
void dfs(map &p,int a,int b,vis &q,int ans)
{
q.x[ans]=a;
q.y[ans]=b;
if(a
p.n&&p.m==b&&p.edg[a][b]==0)//判断是否到出口
{
cont++;//解数增加一
dis(q,ans);//打印路径
return;
}
if(b+1<=p.m&&v[a][b+1]==0&&p.edg[a][b+1]==0)//判断能否向右走
{
v[a][b+1]=1;//标记走过的点
dfs(p,a,b+1,q,ans+1);//递归将向右的下一个坐标作为一个新的向右的发散点
v[a][b+1]=0;//回溯时将走过的点的标记归零
}
if(a+1<=p.n&&v[a+1][b]==0&&p.edg[a+1][b]==0)//判断能否向下走
{
v[a+1][b]=1;
dfs(p,a+1,b,q,ans+1);
v[a+1][b]=0;
}//类似于上
if(b-1>=1&&v[a][b-1]==0&&p.edg[a][b-1]==0)//判断能否向左走
{
v[a][b-1]=1;
dfs(p,a,b-1,q,ans+1);
v[a][b-1]=0;
}//类似于上
if(a-1>=1&&v[a-1][b]==0&&p.edg[a-1][b]0)//判断能否向上走
{
v[a-1][b]=1;
dfs(p,a-1,b,q,ans+1);
v[a-1][b]=0;
}//类似于上
}
int main()
{
map p;
vis q;
create§;//创建迷宫
v[1][1]=1;
dfs(p,1,1,q,0);//从入口开始遍历迷宫
if(cont
0)
cout<<“该迷宫没有解!”<<endl;
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值