深度优先搜索/dfs之迷宫问题

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值