DFS与BFS入门(迷宫问题)

DFS深度优先遍历,侧重于探寻是否有出路,采用递归思想,常常调用函数自身,设置终止的条件,以寻找出路。

BFS广度优先遍历,侧重于探寻出路个数及长短,采用队列思想,将矩阵或图周围的顶点放入队列中然后利用队列先进先出的性质依次遍历。

从例题中感知:

例题:

方形迷宫:现有正方形数字迷宫,其中0表示可以通行,1表示阻塞,第一行输入迷宫的边长(行和列),第二行输入具体的阻塞物(0和1)。

1.用dfs探寻是否可以通行。即:从左上角走到右下角。若可以输出1,若不可输出0。

2.用bfs探寻通路的长短。(保证有一条可通)。输出通路的长度。

dfs代码:

#include <iostream>
using namespace std;
const int N=100;
int n;
int mp[N][N], vis[N][N];
bool fg=false;
int dx[4]={0,0,-1,1} ;
int dy[4]={-1,1,0,0} ;
bool check(int nx,int ny)
{
if(nx>=0&&nx<n&&ny>=0&&ny<n&&vis[nx][ny]==false&&mp[nx][ny]==0)
  return true;;
  return false;
}
void dfs(int x,int y)
{  if(vis[x][y]||fg==true) return;
   if(x==n-1&&y==n-1){ fg=true; }
   vis[x][y]=true;
   for(int i=0;i<4;i++)
   {
       int nx=x+dx[i];
       int ny=y+dy[i];
    if(check(nx,ny))dfs(nx,ny);

   }

}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
         cin>>mp[i][j];
     dfs(0,0);
     //bool fg1=true;
     cout<<fg<<endl;


}

bfs:

#include <queue>
#include <iostream>
using namespace std;
const int N=100;
int n;
int mp[N][N];
bool vis[N][N];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
struct Edge
{int x;int y;int w;};
bool check(int x,int y)
{
if(x>0&&x<=n&&y>0&&y<=n&&vis[x][y]==false&&mp[x][y]==0) return true;
return false;

}
int bfs()
{ queue<Edge> que;
  que.push({1,1,1});
  //vis[0][0]=true;
  while(!que.empty())
    {Edge p=que.front();//cout<<123<<endl;
     que.pop();
     //cout<<p.x<<" "<<p.y<<endl;
     if(p.x==n&&p.y==n) {return p.w;}
     if(vis[p.x][p.y]) continue;
     vis[p.x][p.y]=true;
     for(int i=0;i<4;i++)
     {
      int nx=p.x+dx[i];
      int ny=p.y+dy[i];
      if(check(nx,ny))
      que.push({nx,ny,p.w+1});
     }
    }

}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
 for(int j=1;j<=n;j++)
    cin>>mp[i][j];
cout<<bfs();


}

读代码,体会思想。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值