作为一个刚入坑不久的新手,今天才刚刚开始接触较难算法的学习。首先,我便选择了bfs算法作为算法学习的开始。
由于正处于寒假之中,大部分学习都是属于自学。所以,我便在B站上进行相关算法的学习。从最经典的迷宫问题开始进行bfs学习。
迷宫问题代码如下:
#include<bits/stdc++.h>
using namespace std;
struct point{//定义结构体
int x;
int y;
int step;
};
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};//定义的dx与dy来表示在搜索点在坐标上的下一步运动
queue<point> r;//引入队列
int main()
{
int s[100][100],v[100][100];
int n,m;
scanf("%d %d",&n,&m);
int flag=1;//定义一个flag,来判断有解与无解两种情况
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&s[i][j]);
}
}
int starx,stary,p,q;
scanf("%d %d %d %d",&starx,&stary,&p,&q);
struct point str;
str.x=starx;
str.y=stary;
str.step=0;
r.push(str);//将起始点与步数入队
v[starx][stary]=1;//将起点设置成已访问状态,防止重复
while(!r.empty()){
int x=r.front().x,y=r.front().y;
if(x==p&&y==q){
flag=0;
printf("%d",r.front().step);
break;
}
for(int k=0;k<=3;k++){
int tx,ty;
tx=x+dx[k];
ty=y+dy[k];//用tx、ty代表点运动的方向
if(s[tx][ty]==1&&v[tx][ty]==0){
struct point temp;
temp.x=tx;
temp.y=ty;
temp.step=r.front().step+1;
v[tx][ty]=1;//设置已访问状态
r.push(temp);//将广搜后的下一点入队
}
}
r.pop();//将首队列输出
}
if(flag==1){
printf("No answer");
}
return 0;
}
这个代码比较好懂。在听up主的讲解之后,原先不懂的也慢慢的开始理解。
对于此代码的理解,先要对基本的东西有所了解
1.结构体的定义。该代码中一个主要的思想就是将坐标用定义结构体的方式去表示,减少了许多麻烦,使代码更简洁。
2.队列的出和入。除了结构体外,此代码还有一个关键的点,就是队列的出和入。其中,通过“!r.empty()"判断while循环是否结束,运用的出入队列的概念。
3.二维数组的定义。在代码中,定义了两个二维数组,一个输入,一个访问。
除了上述这些之外,该代码也较高效,简洁
for(int k=0;k<=3;k++){
int tx,ty;
tx=x+dx[k];
ty=y+dy[k];//用tx、ty代表点运动的方向
if(s[tx][ty]==1&&v[tx][ty]==0){
struct point temp;
temp.x=tx;
temp.y=ty;
temp.step=r.front().step+1;
v[tx][ty]=1;//设置已访问状态
r.push(temp);//将广搜后的下一点入队
}
}
这段代码可以替换成:
//右
if(s[x+1][y]==1&&v[x+1][y]==0){
struct point temp;
temp.x=x+1;
temp.y=y;
temp.step=r.front().step+1;
r.push(temp);
}
//下
if(s[x][y-1]==1&&v[x][y-1]==0){
struct point temp;
temp.x=x;
temp.y=y-1;
temp.step=r.front().step+1;
r.push(temp);
}
//左
if(s[x-1][y]==1&&v[x-1][y]==0){
struct point temp;
temp.x=x-1;
temp.y=y;
temp.step=r.front().step+1;
r.push(temp);
}
//上
if(s[x][y+1]==1&&v[x][y+1]==0){
struct point temp;
temp.x=x;
temp.y=y+1;
temp.step=r.front().step+1;
r.push(temp);
}
但是for循环以及数组的运用,让代码变得更加的高效。
这就是今天对于bfs的学习与了解,对于迷宫问题,bfs提供了一种解题的方法。如果有别的需求,可以在此代码基础上进行变通。有时,可能会运用到dfs的思路。
所以,对于bfs和dfs的学习必不可少。