《图》DFS和BFS(C++)

本文介绍使用C++实现深度优先搜索(DFS)和广度优先搜索(BFS),并应用于迷宫寻路问题中寻找最短路径。通过代码示例详细展示了如何在二维网格上进行DFS和BFS搜索,包括初始化、边界检查、状态更新和结果返回等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

之前实现过Java版的dfs,bfs:dfs,bfs求最短路径, java实现,现在用c++再实现一次。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<map>
#include<math.h>
#include<set>
#include<list>
#include<string>
#include<cstring>
#define maxn 50
#define INF 0x7fffffff

using namespace std;

int n,m;
char c[maxn][maxn];
bool vis[maxn][maxn];
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};

struct coordinate{
    int x,y,d;
};

bool isOk(int x,int y,int n,char c[][maxn])
{
    if(x>=0&&x<n&&y>=0&&y<n&&!vis[x][y]&&c[x][y]!='#')
        return true;
    return false;
};

int counter=INF;
int dfs(int x,int y,int d,int n)
{
    vis[x][y]=true;
    for(int i=0;i<4;i++)
    {
        int xx=x+dx[i];
        int yy=y+dy[i];
        //cout<<"xx,yy"<<xx<<" "<<yy<<endl;
        if(isOk(xx,yy,n,c))
        {
            vis[xx][yy]=true;
            int dd=d+1;
            if(c[xx][yy]=='0')
            {
                //cout<<"dd:"<<dd<<endl;
                if(dd<counter)
                    counter=dd;
            }else
                dfs(xx,yy,dd,n);
            vis[xx][yy]=false;//»ØËÝ
        }
    }
    return counter;
}

int bfs(int x,int y,int n,char c[][maxn])
{
    int counter=0;

    queue<coordinate>q;
    coordinate first={x,y,0};
    vis[x][y]=true;
    q.push(first);
    while(!q.empty())
    {
        coordinate top=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int xx=top.x+dx[i];
            int yy=top.y+dy[i];
            if(isOk(xx,yy,n,c))
            {
                vis[xx][yy]=true;
                int dd=top.d+1;
                if(dd>counter)
                    counter=dd;
                if(c[xx][yy]=='0')
                    return counter;
                else
                    q.push({xx,yy,dd});
            }
        }
    }
    return counter;
}


int main(){

    int fx=-1;
    int fy=-1;
    cin>>n;
    string str;
    for(int i=0;i<n;i++)
    {
        cin>>str;
        for(int j=0;j<str.length();j++)
        {
            c[i][j]=str[j];
            if(str[j]=='@')
            {
                fx=i;
                fy=j;
            }
        }
    }

    memset(vis,false,sizeof(vis));
    cout<<"dfs:"<<dfs(fx,fy,0,n)<<endl;

    memset(vis,false,sizeof(vis));
    cout<<"bfs:"<<bfs(fx,fy,n,c)<<endl;

    return 0;
}

结果展示:

 

<think>我们首先需要理解用户的需求:用户想要获取DFS(深度优先搜索)BFS(广度优先搜索)算法在C++中的实现流程。 由于我们无法直接绘制像,但可以通过文字描述流程的结构,并辅以伪代码或C++代码示例,同时用文字说明每个步骤。 此外,我们可以提供简单的流程描述(例如,使用文字描述流程的各个节点箭头方向)。 注意:用户要求使用中文回答,并且按照之前的系统指令,我们需要在行内数学公式使用$...$,独立公式使用$$...$$(但本题可能较少涉及数学公式,主要是算法描述)。 同时,我们需要在最后生成相关问题。 我们将分别描述DFSBFS的算法流程,并用C++代码示例说明,然后给出流程的文字描述。 参考之前的引用[^1]:BFS用于找单一最短路线,DFS用于找所有解。但这里我们主要关注实现。 步骤: 1. 介绍DFSBFS的基本概念。 2. 分别给出DFSBFSC++代码实现(伪代码或真实代码)。 3. 用文字描述流程(例如:开始->初始化栈/队列->循环直到栈/队列为空->处理节点->访问相邻节点->结束等)。 4. 生成相关问题。 注意:由于要求回答结构清晰,我们将分步骤进行。 开始回答:</think>### DFSBFS算法实现与流程C++) #### **DFS(深度优先搜索)** **算法思想**:从起点出发,沿一条路径尽可能深入探索,直到无法继续时回溯,尝试其他分支[^1]。 **C++实现**: ```cpp #include <vector> #include <stack> using namespace std; void DFS(vector<vector<int>>& graph, int start) { vector<bool> visited(graph.size(), false); stack<int> s; s.push(start); while (!s.empty()) { int node = s.top(); s.pop(); if (!visited[node]) { visited[node] = true; // 处理当前节点(如打印) for (int neighbor : graph[node]) { if (!visited[neighbor]) { s.push(neighbor); } } } } } ``` **流程**: ``` 开始 ↓ 初始化栈访问数组 ↓ 起点入栈 ↓→→→ 栈空? →→→→→ 结束 ↓是 ↓否 ↓ 弹出栈顶节点 ↓ 已访问? →→→ 是 →→→ 跳过 ↓否 ↓否 ↓ 标记为已访问 ↓ 遍历邻居节点 →→→ 未访问? →→→ 入栈 ↓←←←←←←←←←←←←←←←←↓ ``` #### **BFS(广度优先搜索)** **算法思想**:从起点开始逐层扩展,先访问所有相邻节点,再访问相邻节点的相邻节点[^1]。 **C++实现**: ```cpp #include <vector> #include <queue> using namespace std; void BFS(vector<vector<int>>& graph, int start) { vector<bool> visited(graph.size(), false); queue<int> q; q.push(start); visited[start] = true; while (!q.empty()) { int node = q.front(); q.pop(); // 处理当前节点(如打印) for (int neighbor : graph[node]) { if (!visited[neighbor]) { visited[neighbor] = true; q.push(neighbor); } } } } ``` **流程**: ``` 开始 ↓ 初始化队列访问数组 ↓ 起点入队并标记 ↓→→→ 队列空? →→→→→ 结束 ↓是 ↓否 ↓ 弹出队首节点 ↓ 遍历邻居节点 →→→ 未访问? →→→ 入队并标记 ↓←←←←←←←←←←←←←←←←↓ ``` #### **关键区别** 1. **数据结构**:DFS用栈(后进先出),BFS用队列(先进先出)。 2. **访问顺序**:DFS优先深度,BFS优先广度。 3. **应用场景**: - DFS适合拓扑排序、连通分量检测(空间效率高)[^1]。 - BFS适合最短路径(如迷宫、社交网络)[^1]。 --- ### 相关问题 1. DFS递归实现与迭代实现有何性能差异? 2. 如何用BFS解决无权的最短路径问题? 3. DFS在遍历树结构时会产生哪种序列(前序/中序/后序)? 4. 如何处理中存在环路时的DFS/BFS访问标记? [^1]: BFS常用于找单一的最短路线,DFS用于找所有解的问题,两者在空间效率搜索策略上有本质区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值