如何遍历 2D 阵列?
How does a 2D Array get traversed?
不久前我正在研究这个问题,并提出了这个解决方案:
// 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;
}
相关文章:
- 库特<<恩德尔;不适用于打印 2D 阵列
- 具有可变尺寸的 C++ 2D 阵列
- 如何遍历 2D 阵列?
- 超级对撞机2D阵列:生成嵌套:包装/尺寸问题
- 动态 2D 阵列.为什么分段错误?
- 尝试使用2D阵列
- 分配给阵列时出现分段错误?黑客排名 2D 阵列 - DS.
- 如何将1D阵列访问为2D阵列
- 分配/访问2d阵列,使得2d子块是连续的
- 重新分配2D阵列并删除旧阵列
- 不使用新的动态2D阵列
- 我正在为2D阵列参数而挣扎
- 特征和巨大的密集 2D 阵列
- 使用 std::transform 在 2d C 阵列上转换为 1d C 数组
- 解除分配此特定 2D 阵列的内存
- 使用两个不同大小的一维阵列制作 2D 阵列
- 返回C 中2D阵列的对角线元素总和
- 2D阵列让我卡住了
- 用pybind11铸造2D阵列
- 我的 2D 阵列无法读取文本文件并正确输出