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