杂|使用dfs遍历数组

使用DFS遍历数组

通常来说,遍历一个数组,或者二维数组,我们是用 for,几个维度就用几个 for,似乎是天经地义的。

今天想来,其实遍历本质就是一个数处理完,去处理下一个数。那么用 dfs 其实也可以。dfs 通常是保存当前状态,然后带着新的入参进入到下一个处理单元。本质和 for 是一样的,感觉上来看,一个是横着遍历,一个是竖着遍历,这是处理的感觉。而真正遍历的情况,是看使用的情况。

我举个例子,3×3 二维数组按行优先遍历:

cpp 复制代码
#include <iostream>
using namespace std;

int matrix[3][3];

void dfs(int i, int j) {
    cout << matrix[i][j] << " ";

    if (i == 2 && j == 2) {
        return;
    }

    if (j < 2) {
        dfs(i, j + 1);
    } else {
        cout << endl;
        dfs(i + 1, 0);
    }
}

int main() {
    int cnt = 0;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            matrix[i][j] = cnt++;
        }
    }

    // 下面是 for 遍历版本,注释掉
    // for (int i = 0; i < 3; i++) {
    //     for (int j = 0; j < 3; j++) {
    //         cout << matrix[i][j] << " ";
    //     }
    //     cout << endl;
    // }

    dfs(0, 0);

    return 0;
}

输出:

text 复制代码
0 1 2 
3 4 5 
6 7 8 

dfs(0,0) 先处理当前元素,然后如果 j < 2,就往右走;走到行末就换行,再下移一行。终止条件是 (2,2)。

和双重 for 比,访问顺序是一样的,只是写法不同。dfs 把下一个位置作为入参传下去,for 用循环变量推进。用哪个看场景。

相关推荐
蚰蜒螟1 小时前
vmware17 ubuntu24.04编译android aosp16
1024程序员节
码完就睡1 小时前
Linux——以太网协议
运维·服务器·网络·1024程序员节
职豚求职小程序刷题1 小时前
光大证券在线测评|时间&考点整理好啦(附练习题库)
1024程序员节
天远API2 小时前
零信任架构实战:基于天远企业二要素验证构建自动化跨境物流货代授信签约网关
人工智能·1024程序员节·工具分享
@嵌入式扫地僧2 小时前
实战教程:NVIDIA Jetson Nano 8GB 搭建本地 RAG 大语言模型知识库完整指南
人工智能·ai·jetson nano·1024程序员节·rag
叼烟扛炮2 小时前
Linux 学习笔记(三十二):线程控制——创建、等待与分离
linux·运维·服务器·笔记·学习·1024程序员节
天天进步20152 小时前
Unity 2020.3 反复提示安全模式:一次 CS0009 与 DLL 文件占用的排查记录
unity·1024程序员节
计算机毕业编程指导师2 小时前
2027计算机毕设选题指南:网站AI化、大数据预测+算法(XGBoost/LightGBM)、深度学习三方向57题+选题方法论
大数据·python·计算机·毕业设计·课程设计·毕设选题·1024程序员节
m0_639906942 小时前
JVM 核心基础|运行时数据区、类加载过程、双亲委派模型
1024程序员节