假设存在N×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的位置的索引上,你怎么知道你可以在不改变行的情况下离开,但是向右行将进入下一行? 如何根据边缘访问单元格的邻居? 9位于第4行的索引没有右邻居。
我能想到如何做到这一点的唯一方法是当前索引,在这种情况下是
int index = row * num_cols + col
并且可能使用模数(索引%5 == 0)来确定是否在边缘。但这并不能决定我们是向左还是向右。
答案 0 :(得分:1)
您可以使用
int row = index / N;
int col = index % N;
获取行和列索引。例如,第9个条目的行索引9/5 = 1,列索引9%5 = 4。
计算了(row, col)
坐标后,您可以确定它是否具有左邻居或右邻居。当col == 0
时,你没有左邻居;当col == N-1
时,你没有合适的邻居。
答案 1 :(得分: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
时你处在右边缘。