1、问题描述:在一个迷宫中有几条路可以走出去?
迷宫结构如下:(用数组来表示,0代表可走,1表示堵死,从mape[1][1]开始,在该点往左或右上走都算越界)
int mape[5][6]={ //地图
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,1,0,0,0,
0,0,0,0,1,1,
0,0,1,0,0,0,
};
2、解法:
#include<bits/stdc++.h>
using namespace std;
int check[5][6]={0};
int mape[5][6]={ //地图
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,1,0,0,0,
0,0,0,0,1,1,
0,0,1,0,0,0,
};
int cnt = 0;
int vis[5][6];
void dfs(int a,int b)
{
if(vis[a][b])return;
if(a==4&&b==5){
cnt++;
return;
}
vis[a][b] = 1;
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
{
if(i ==j || abs(i)==abs(j))continue;
int newa = a+i;
int newb = b+j;
if(newa<1 || newa>4 || newb<1 || newb >5)continue;
if(vis[newa][newb] == 0 && mape[newa][newb]==0)
{
//vis[]
dfs(newa,newb);
}
vis[a][b] = 0;
}
int main()
{
memset(vis,0,sizeof(vis));
dfs(1,1);
cout<<cnt<<endl;
return 0;
}
3、稍微优化:即从两重for循环优化成一重
#include<bits/stdc++.h>
using namespace std;
int check[5][6]={0};
int mape[5][6]={ //地图
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,1,0,0,0,
0,0,0,0,1,1,
0,0,1,0,0,0,
};
int x[4]={0,1,0,-1};
int y[4]={1,0,-1,0};
int cnt = 0;
int vis[5][6];
void dfs(int a,int b)
{
if(vis[a][b])return;
if(a==4&&b==5){
cnt++;
return;
}
//vis[a][b] = 1;
for(int i=0;i<4;i++)
//for(int j=-1;j<=1;j++)
{
//if(i ==j || abs(i)==abs(j))continue;
int newa = a+x[i];
int newb = b+y[i];
if(newa<1 || newa>4 || newb<1 || newb >5)continue;
if(vis[newa][newb] !=1 && mape[newa][newb]==0)
{
vis[a][b] = 1;
dfs(newa,newb);
vis[a][b] = 0;
}
}
//vis[a][b] = 0;
}
int main()
{
memset(vis,0,sizeof(vis));
dfs(1,1);
cout<<cnt<<endl;
return 0;
}
4、相应的解题模板:
在3的基础上更改mape及加上对应的限制条件即可。
这篇博客介绍了如何利用C++实现深度优先搜索(DFS)算法解决一个二维数组表示的迷宫问题,找到所有可能的出口路径。通过将两重循环优化成一重,提高了代码效率。解题模板展示了如何在不同迷宫结构下应用此算法。
7687

被折叠的 条评论
为什么被折叠?



