深搜和广搜总结(2021.June.30.Friday)<博客第一篇>

引子:广泛搜索且盲目。

深搜:代码如下(dfs)

void dfs(int u)
{
   vis[u]=true;
   for(int i=head[u];i;i=next[i])
   {
      int v=ver[i];
      if(vis[v]) continue;
      dfs(v);
   }
}

    解释:任选一条边走下去,执行递归,直至回溯到点u后,再考虑走其他的边。

---------------------------------------------------------------------------------------------------------------------------------

广搜:代码如下(bfs)

void bfs()
{
   memset(d,0,sizeof(d));
   memset(vis,0,sizeof(vis));
   queue<int> q;
   q.push(1),d[1]=1,vis[1]=true;
   while(q.size())
   {
      int u=q.front();q.pop();
      for(int i=head[u];i;i=next[i])
      {
         int v=ver[i];
         if(vis[v])  continue;
         d[v]=d[u]+1;
         vis[v]=true;
         q.push(v);
      }
   }
}

   解释:彻底地搜索整张图,直到找到目标为止。

---------------------------------------------------------------------------------------------------------------------------------

 写题心得

       1.深搜第一题,“拔河游戏”     这题主要还是模板。寻要注意的是保存结果时的条件==

题目上明确要求两边人数不得相差超过一人.....也就是说只有在(y==n/2)时才将结果保存下来,

这题dfs用了三个条件...分别是考虑到第几个人,选了几个人,此时所有选的人的数量之和。 

和dp异曲同工

      2.广搜第一题"走迷宫图"就纯纯的模板题le。

 首先要有这个

       

const int dx[4]={-1,0,1,0},
          dy[4]={0,1,0,-1};

       解释:这个表示的是标记点所走的方向,x和y需要一一对应.

当然,还要用vis【】数组来标记是否走过。

---------------------------------------------------------------------------------------------------------------------------------

      不要把二维数组开太大不然就会。。。。。

  

   出现“源文件未编译”的提示,弄了我好长一段时间一般开a[10000][10000]就差不多le

结构体直接当做一种数据类型使用 。。。

---------------------------------------------------------------------------------------------------------------------------------

     3.再来说一下广搜的模板。。。(必看)

bool exist(int x,int y)//判断是否出界
{
     return 1<=x&&x<=n&&1<=y&&y<=n;
}
void bfs()
{
    memset(vis,false,sizeof(vis));//vis[]表示有没有走过
    queue< pair<int,int> > q;//建立一个队列,“pair”表示有两个数据,有更多的数据可以有结构体
    q.push(make_pair(sx,sy));//入列
    d[sx][sy]=0;//d[]表示到(sx,sy)的距离
    vis[sx][sy]=true;//标记
    while(q.size())
    {
          pair<int,int> u=q.front();//标记
          q.pop();//取出来
          int x=u.first ,y=u.second;//取出两个数据
          if(x==tx&&y==ty)//tx,ty表示终点
          {
              printf("%d/n",d[tx][ty]);//输出
              return; 
          }
          for(int i=0;i<4;++i)
          {
              int nx=x+dx[i],ny=y+dy[i];//开始向四周扩展
              if(exist(nx,ny)&&a[nx][ny]=='0'&&!vis[nx][ny])
              {
                    d[nx][ny]=d[x][y]+1;
                    vis[nx][ny]=true;
                    q.push(make_pair(nx,ny));//入队
              }
          }    
     }
}

——————————————————————于2021年7月31日19:09结尾。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值