如何遍历 2D 阵列?

How does a 2D Array get traversed?

本文关键字:2D 阵列 遍历 何遍历      更新时间:2023-10-16

不久前我正在研究这个问题,并提出了这个解决方案:

// Complete the hourglassSum function below.
int hourglassSum(vector<vector<int>> arr) {
int max = INT_MIN;
vector<int> sums;
for (int i = 1; i < 5; i++) 
{
for (int j = 1; j < 5; j++) 
{
sums.push_back(arr[i][j] +
arr[i - 1][j-1] +
arr[i-1][j] +
arr[i-1][j+1] +
arr[i + 1][j - 1] +
arr[i+1][j] +
arr[i + 1][j + 1]); 
}    
}
for (int g = 0; g  < sums.size(); g++) {
cout << sums[g] << endl;
}
for (int k = 0; k < sums.size(); k++) 
{
if (sums[k] > max)
{
max = sums[k];
}
}
return max;
}

我最初有一个不同的解决方案,但更改了 i 和 j 的位置以使其工作。 这让我想到了以下问题:在遍历 2D 数组时,是否可以假设 i 水平移动而 j 垂直移动?

只要你的心智模型是一致的,"水平"和"垂直"就是你想要的。您可以考虑(x, y)点,其中x在水平方向上,y在垂直方向上。或者,您可以将数组视为一个矩阵,其中i是行号,j是列号。这两种观点都将奏效。同样,一致性是重要的事情。

我检查这个问题是为了好玩。您可以创建某种掩码来获取沙漏的当前值。然后,您可以从左到右和从右到左互换遍历数组。当到达右端或左端时,向下。像这样:

#include <bits/stdc++.h>
using namespace std;
// Complete the hourglassSum function below.
int maskArray(std::vector<std::pair<int, int>> &mask, std::vector<std::vector<int>> &array) {
int sum = 0;
for (auto& v : mask) {
sum += array[v.first][v.second];
}
return sum;
}
void moveMaskLeft(std::vector<std::pair<int, int>>  &mask) {
for (auto& v : mask) {
--v.second;
}
}
void moveMaskRight(std::vector<std::pair<int, int>>  &mask) {
for (auto& v : mask) {
++v.second;
}
}
void moveMaskDown(std::vector<std::pair<int, int>>  &mask) {
for (auto& v : mask) {
++v.first;
}
}
int hourglassSum(vector<vector<int>> arr) {
int maxSum = std::numeric_limits<int>::min();
std::vector<std::pair<int, int>> mask{{0,0}, {0,1}, {0,2},
{1,1},
{2,0}, {2,1}, {2,2}};
enum direction {R, L};
direction dir = R;
for (int y = 0; y < 4; ++y) {
for (int x = 0; x < 4; ++x) {
int localSum = maskArray(mask, arr);
maxSum = std::max(maxSum, localSum);
if (dir == R) {
if (x < 3)
moveMaskRight(mask);
} else {
if (x < 3)
moveMaskLeft(mask);
}
}
dir = dir == R ? L : R;
moveMaskDown(mask);
}
return maxSum;
}
int main()
{
ofstream fout(getenv("OUTPUT_PATH"));
vector<vector<int>> arr(6);
for (int i = 0; i < 6; i++) {
arr[i].resize(6);
for (int j = 0; j < 6; j++) {
cin >> arr[i][j];
}
cin.ignore(numeric_limits<streamsize>::max(), 'n');
}
int result = hourglassSum(arr);
fout << result << "n";
fout.close();
return 0;
}