首先,搜索算法作为最重要的一个算法,它包括两种算法,一是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;
}
正在努力学习中的小白,后面将继续更新,欢迎大佬指点!