zoukankan      html  css  js  c++  java
  • DFS BFS模板

    DFS:

    /*
    该DFS框架以2D坐标范围为例,来体现DFS算法的实现思想。
    */

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    using namespace std;

    const int maxn=100;

    bool vst[maxn][maxn];    // 访问标记

    int map[maxn][maxn]; // 坐标范围
    int dir[4][2]={0,1,0,-1,1,0,-1,0};  // 方向向量,(x,y)周围的四个方向

    bool CheckEdge(int x,int y) // 边界条件和约束条件的判断
    {
     if(!vst[x][y] && ...)  // 满足条件
      return 1;
     else   // 与约束条件冲突
      return 0;
    }

    void dfs(int x,int y)
    {
     vst[x][y]=1; // 标记该节点被访问过
     if(map[x][y]==G) // 出现目标态G
     {
      ......  // 做相应处理
      return;
     }
     for(int i=0;i<4;i++)
     {
      if(CheckEdge(x+dir[i][0],y+dir[i][1]))  // 按照规则生成下一个节点
       dfs(x+dir[i][0],y+dir[i][1]);
     }
     return;  // 没有下层搜索节点,回溯
    }

    int main()
    {
     ......
     return 0;
    }

    ------------------------------------------------------华丽分割线----------------------------------------------------------------------------

    BFS:

    /*
    该框架是2D坐标范围内做BFS设计的,使用STL实现
    */

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    using namespace std;

    const int maxn=100;

    bool vst[maxn][maxn];  // 访问标记

    int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量
    struct State   // BFS队列中的状态数据结构
    {
     int x,y; // 坐标位置
     int Step_Counter; // 搜索步数统计器
    };
    State a[maxn];

    bool CheckState(State s)  // 约束条件检验
    {
     if(!vst[s.x][s.y] && ...)  // 满足条件
      return 1;
     else   // 约束条件冲突
      return 0;
    }

    void bfs(State st)
    {
     queue <State> q; // BFS队列
     State now,next;  // 定义2个状态,当前和下一个
     st.Step_Counter=0; // 计数器清零
     q.push(st);   // 入队
     vst[st.x][st.y]=1;  // 访问标记
     while(!q.empty())
     {
      now=q.front(); // 取队首元素进行扩展
      if(now==G) // 出现目标态,此时为Step_Counter的最小值,可以退出即可
      {
       ...... // 做相关处理
       return;
      }
      for(int i=0;i<4;i++)
      {
       next.x=now.x+dir[i][0];  // 按照规则生成下一个状态
       next.y=now.y+dir[i][1];
       next.Step_Counter=now.Step_Counter+1;  // 计数器加1
       if(CheckState(next))  // 如果状态满足约束条件则入队  
       {
        q.push(next);   
        vst[next.x][next.y]=1;  //访问标记
       }
      }
      q.pop(); // 队首元素出队
     }
     return;
    }

    int main()
    {
     ......
     return 0;
    }

  • 相关阅读:
    iscsi-分区类型
    NFS
    测试目录
    测试
    函数
    循环、枚举、条件判断、选择排序
    格式化、列表、元组、字典、集合
    常量、注释、变量、堆栈、数据类型、强制转换
    站点迁移至https://traceless.site/
    CENTOS7 源码安装NGINX
  • 原文地址:https://www.cnblogs.com/pfdm/p/ACM.html
Copyright © 2011-2022 走看看