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及加上对应的限制条件即可。