Не уверен, что вы имеете в виду. Обычно сдвиг вправо применяется к буферу или вектору-строке. Ответ будет зависеть от того, как хранится ваша матрица.
Эффективный способ повернуть массив, если это позволяет структура памяти, состоит в том, чтобы скопировать первое значение в конец массива, а затем переместить указатель на массив на один элемент вверх. Это будет работать, только если вы выделите достаточно места для массива и не будете вращать его слишком много раз.
Или вы можете просто оставить массив на месте и иметь дополнительный указатель на «левый конец», позаботившись о том, чтобы правильно обрабатывать все обертывания в других ваших операциях.
В противном случае вам, вероятно, придется много копировать в память.
Изменить: я вижу, вы только что обновили вопрос, чтобы включить этот ответ.
Другое редактирование: Судя по примерам, вам не нужно отдельно сдвигать строки и столбцы. Если это так, то вам просто нужно сохранить координаты «верхнего левого» индекса и соответствующим образом изменить все операции с матрицами для поиска значений в структуре данных.
Тогда проблема для вас становится вопросом, где вы хотите повысить эффективность. Собираетесь ли вы выполнять много сменных операций? В противном случае, возможно, не стоит замедлять все операции умножения дополнительным поиском.
И если вы действительно используете идею поиска, определенно НЕ используйте оператор мода. Это невероятно неэффективно. Вместо этого для сдвига просто проверьте длину строки или столбца, превышающую длину строки или столбца, и при необходимости вычтите длину.
person
uncleO
schedule
25.09.2009