杂|使用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 用循环变量推进。用哪个看场景。

相关推荐
普通人61 天前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
猫猫不是喵喵.2 天前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
fish_zzzz5 天前
笔记-论数据结构2
1024程序员节
普通人66 天前
PHP文件读写完全指南
开发语言·php·1024程序员节
Martina_03216 天前
AI生成3D场景从白模换成精模后镜头全偏了?用6步检查单位、枢轴与层级替换
图像处理·人工智能·3d·ai·自然语言处理·材质·1024程序员节
星云_byto7 天前
CSS布局
人工智能·机器学习·目标跟踪·1024程序员节
张小姐的猫10 天前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
工业HMI实战笔记11 天前
印刷电路板HMI:SMT贴装的元件定位界面
制造·设计规范·设计语言·1024程序员节
Martina_032111 天前
AI生成3D模型一合并网格,材质就串色?用6步检查材质槽、UV与图集重映射
图像处理·人工智能·3d·材质·uv·游戏策划·1024程序员节
橙光成长11 天前
android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送
android·1024程序员节