0

假设有一个 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)来确定是否在边缘。但这并不能决定我们是否可以向左或向右。

4

2 回答 2

1

您可以使用

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

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

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

于 2013-10-07T01:44:03.133 回答
1

你的公式

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

于 2013-10-07T01:44:15.897 回答