重生之我爱搜索算法 (dfs篇章)

首先,搜索算法作为最重要的一个算法,它包括两种算法,一是dfs搜索算法(又叫深度搜索)另一个是bfs搜索算法(又叫广度优先搜索)今天重点讲述一下我对dfs算法

  dfs最大的特点就是一条路走到底(不撞南墙不回头),只有先走完一条路才会走另一条路。如果遇到障碍,返回上一个结点继续走另一条路。

  例子才是最形象的解释,上栗子:

搜索算法被经常用来解决迷宫问题,所以先用一个简单的迷宫分析题带入

  栗子1:已知一个迷宫及其入口和出口,现在从迷宫的入口出发,查看是否存在一条路径,如果存在,则输出yes,否则输出no。

例题分析:本题目只需要知道是否能走到出口即可,判断出一条正确路径就结束了。解题的几个重点思想如下:

首先我们要知道结束条件是什么(判断结束条件其实就是当前坐标等于出口目标纪达到出口)

其次我们要知道有几种走法(一个点可以向上,左,下,右四个方向移动)

再其次我们要知道当前走的点是否合法(边界之内,因为dfs搜索算法涉及到回溯,所以我们还要判断是否已经走过这个点。

开始写各个步骤的代码:我们先设一个函数int dfs(int x,int y)

判断结束条件

//(m,n)为出口坐标 
if(x==m&&y==n)//到达出口条件 
{
   f++; //若f大于0则证明能到达出口,若f==0则证明无法从入口到出口 
}

接下来就是需要一段代码让其能朝向上下左右四个方向移动:

int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};//四个方向 
		for(int i=0;i<4;i++)
		{
		int ex=x+dx[i];
		int ey=y+dy[i];//得到新坐标(ex,ey)			
		}

然后就是判断我们得到的这个新坐标合不合法(在不在界内,是不是障碍,是否走过)

	if(ex<1||ex>=m+1||ey<1||ey>=n+1)//判断是否出界 
	continue;
	else if(a[ex][ey]==1)//判断是否被阻挡 ,在这道题中我们假设1为障碍无法通过,0代表可以通过 
	continue;
	if(!b[ex][ey])//判断是否走过 

最重要的一步就是回溯

		if(!b[ex][ey])//判断是否走过 
		{
			b[ex][ey]=1;
			dfs(ex,ey);
			b[ex][ey]=0;
		}

最后在主函数里面进行一个判断就可以了,若f大于0则说明有到达出口的路线,反之没有。

完整代码:

#include<bits/stdc++.h>
using namespace std;
int m,n;//迷宫长宽 
int f=0;
int a[1000][1000],b[1000][1000];//a为迷宫,b记录是否走过 
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};//四个方向
void dfs(int x,int y)
{
	if(x==m&&y==n)//到达出口条件 
	{
		f++; //若f大于0则证明能到达出口,若f==0则证明无法从入口到出口 
	}
	for(int i=0;i<4;i++)
	{
		int ex=x+dx[i];
		int ey=y+dy[i];
		if(ex<1||ex>=m+1||ey<1||ey>=n+1)//判断是否出界 
		continue;
		else if(a[ex][ey]==1)//判断是否被阻挡 ,在这道题中我们假设1为障碍无法通过,0代表可以通过 
	    continue;
		if(!b[ex][ey])//判断是否走过 
		{
			b[ex][ey]=1;
			dfs(ex,ey);
			b[ex][ey]=0;
		}
	}
}
int main()
{
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
	cin>>a[i][j];
	dfs(1,1);
	if(f==0)
	cout<<"no";
	else
	cout<<"yes";
	return 0;
}

正在努力学习中的小白,后面将继续更新,欢迎大佬指点!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值