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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 16:35:45

BFS DFS 模板的相关文章

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

BFS/DFS算法介绍与实现(转)

广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比如:Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.BFS的思想:从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.--Vn,然后依次访问与V1.V2--Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个图.由此

邻结矩阵的建立和 BFS,DFS;;

邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!---------------------------------------------------------------------------------------------------------------------------------------//邻接矩阵的建立和 其BFS, DFS, 遍历 #include <

HDU ACM 1044 Collect More Jewels BFS+DFS

题意:在一个迷宫中,有一些宝物,从起点走到终点,问在给定的时间内,到达终点后所能拾取珠宝的最大价值. 分析(BFS+DFS): 1.求入口到第一个取宝物的地方的最短距离 2.求第i个取宝物的地方到第i+1个取宝物的地方的最短距离 3.求第n个取宝物的地方到出口的最短距离 4.保证以上3点能在时间L内实现的情况下,取得的宝石价值最大. BFS特点:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元来存储状态) DFS特点:对于解决遍历和求所有问题有效,对于问

建图方式一 之 ”前向星“ BFS&amp;&amp;DFS 简单应用

三种建图方式,邻接矩阵.前向星(边表集).邻接链表! 耗时一晚上 ,好好研究了一下 前向星,因为我的指针用的实在是很烂,所以还是 入赘 前向星吧. 问了学长,看了大牛们的博客,终于有点收获了,个人认为 前向星Very Well. 前向星 建图方法: 以储存边的方式来储存图.在构造图时,把边存放在数组里,不需使用指针,只需一个 next  即可是整个图构建完成 . 适用条件: 点集特别多的稀疏图,边数多且繁杂,开邻接矩阵会浪费大量内存. 时间复杂度: O(m),并不比邻接链表差. #include

UVALive - 6455 Stealing Harry Potter&#39;s Precious (bfs+dfs)

https://cn.vjudge.net/problem/UVALive-6455 题目大意:题目上给出一个地图,其中@是人在地图上的出发点,#是墙,' . '是路.然后给出几个点,这些点表示财宝的所在地.问人是否能够得到所有的宝藏,如果能够的话给出所有的宝藏的最短的路径. 解题思路:由于只有最多4个宝藏所在地,所以只要用bfs找出出发点和财宝所在地距离到达其他点的步数.因为最多只有4个宝藏,所以可以暴力找出出发点到所有宝藏的最短距离. 暴力代码: 1 #include<stdio.h> 2

Collect More Jewels(hdu1044)(BFS+DFS)

Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6857    Accepted Submission(s): 1592 Problem Description It is written in the Book of The Lady: After the Creation, the cruel

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>

POJ 1130(一道纯水,bfs+dfs)

POJ 1130 大概题意:给出一副图,求从起点到终点 (0->ET) 必须经过的一点. 我的思路:首先DFS求出经过每点的次数,必过的一点的次数一定最高,但是就这样吗?有可能有多个必过的点,所以还要找出离ET最近的点,这里就利用BFS逐层搜索的性质求每点到ET的距离. #include<iostream> #include<cstdio> #include<string.h> #include<iomanip> #include<queue&g