Пусть говорят, что существует квадратный 2-мерный массив 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 столбцов, как можно определить, находятся ли они на краю строки? Например, если вы находитесь в индексе, где 9 находится в 4-й строке, как вы можете знать, что можете идти влево, не меняя строки, но переход вправо перейдет к следующей строке? Как можно получить доступ к соседям соседей по отношению к ребрам? Индекс того, где 9 находится на 4-й строке, не имеет правого соседа.
Единственный способ, которым я могу думать, как это сделать, - это текущий индекс, и в этом случае
int index = row * num_cols + col
и, возможно, использовать модуль (индекс% 5 == 0), чтобы определить, по краю. Но это не определяет, можем ли мы идти влево или вправо.
Вы можете использовать
int row = index / N;
int col = index % N;
для получения индексов строк и столбцов. Например, 9-я запись имеет индекс строки 9/5 = 1 и индекс столбца 9% 5 = 4.
(row, col)
координату (row, col)
, вы можете определить, имеет ли она левых или правых соседей. Когда col == 0
, у вас нет левого соседа; когда col == N-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
.