导航具有列边界的数组

Navigating an Array with Column Boundaries

本文关键字:数组 边界 导航      更新时间:2023-10-16

假设有一个 N x N 的正方形二维数组,表示为一维数组。让数组为 5x5,如下所示,数组中的值并不重要。

std::vector< int > array {
    0, 1, 2, 3, 4,
    5, 6, 7, 8, 9,
    0, 1, 2, 3, 4,
    5, 6, 7, 8, 9,
    0, 1, 2, 3, 4
};

如果我们说这个数组中有 5 行和 5 列,如何检测它们是否在行的边缘?例如,如果您在第 4 行 9 的索引上,您怎么知道您可以向左移动而不更改行,但向右移动将前进到下一行?如何访问单元格相对于边缘的邻居?第 4 行中 9 的索引没有右邻。

我能想到如何做到这一点的唯一方法是当前索引,在这种情况下是

int index = row * num_cols + col

也许使用模量(指数 % 5 == 0)来确定是否处于边缘。但这并不能决定我们可以向左还是向右。

您的公式

int index = row * num_cols + col;

向上或向下相当于加/减num_cols

是正确的。它的反面是

int row = index / num_cols;
int col = index % num_cols;

你知道你在(index % num_cols) == 0时在左边缘。

你知道你在(index % num_cols) == num_cols-1时处于正确的边缘。

您可以使用

int row = index / N;
int col = index % N;

以获取行索引和列索引。例如,第 9 个条目的行索引为 9/5=1,列索引为 9%5=4。

计算(row, col)坐标后,您可以确定它是具有左邻还是右邻域。col == 0时,你没有左邻居;col == N-1时,你没有合适的邻居。