Навигация по массиву с границами столбцов

0

Пусть говорят, что существует квадратный 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), чтобы определить, по краю. Но это не определяет, можем ли мы идти влево или вправо.

Теги:
arrays
vector

2 ответа

1

Вы можете использовать

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

для получения индексов строк и столбцов. Например, 9-я запись имеет индекс строки 9/5 = 1 и индекс столбца 9% 5 = 4.

(row, col) координату (row, col), вы можете определить, имеет ли она левых или правых соседей. Когда col == 0, у вас нет левого соседа; когда col == N-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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню