对c++之中的dfs算法的解析

本文解析了一个简单的C++代码,展示了如何使用深度优先搜索(DFS)算法解决迷宫问题。重点介绍了vis数组的作用,以及returntrue和return的区别,用于标记已访问节点和找到路径的终止条件。
摘要由CSDN通过智能技术生成

#include <iostream>

#include <vector>

#include <queue>

using namespace std;

int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};

bool in(int x, int y){

    return 0 <= x && x < n && 0 <= y && y < m;

}

queue<pair<int, int>> path; // 保存经过的路径

bool dfs(int x, int y){

    if(maze[x][y] == 'T'){

        return true;

    }

    vis[x][y] = 1;

    maze[x][y] = 'm';

    path.push({x, y}); // 将当前位置加入路径

    for(int i = 0; i < 4; i++){

        int tx = x + dir[i][0];

        int ty = y + dir[i][1];

        if(in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty]){

            if(dfs(tx, ty)){

                return true;

            }

        }

    }

    vis[x][y] = 0;

    maze[x][y] = '.';

    path.pop(); // 将当前位置移出路径

    

    return false;

}

 

int main(){

    // 在适当的地方调用 dfs 函数进行搜索

    

    // 打印经过的路径

    while(!path.empty()){

        pair<int, int> pos = path.front();

        cout << "(" << pos.first << ", " << pos.second << ")" << endl;

        path.pop();

    }

    

    return 0;

}

这是一个简单的dfs算法出迷宫的问题,在初学情况下不懂这个代码之中的定义的个个数组都是什么意思,今天来解析一下。

〈一〉在这个代码之中定义了一个vis数组,全称visited,是用来判断这个点是否经过并且用来保存得一个数组。

〈二〉在这个问题之中定义了vis[x][y]=1,以及vis[x][y]=0的两种情况等于1时相当于已经访问过,等于0就是还没被访问。

〈三〉return true和return两者的使用情况当返回true时则表明已经找到路径并且一条就够了直接返回并且不再查找,而使用return的时候则表明找到了就停止继续返回查找路径,一般这种情况用于查找最短路径问题的求解。

这是关系图:

2b8c7ad4915b46cea58217452bc81434.jpg

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值