Циклический сдвиг прямоугольной матрицы

Нужно осуществить сдвиг прямоугольной матрицы на k элементов вправо или вниз, где k может быть больше кол-ва элементов в строке или столбце. Код работает в целом, но сдвиг вниз не работает. Я вроде перевернул массив, но неудачно. p.s. Если кто-то покажет как написать сдвиг проще, буду очень благодарен.

int main(){
int m, n, k, side;
double tmp;
cout << "Enter the size of matrix.\n";
cin >> m >> n; //m-строки, n-столбцы

double** arr = new double* [m];
for (int i = 0; i < m; i++){
    arr[i] = new double[n];
}

for (int i = 0; i < m; i++){ //Заполнение случайными числами и вывод изначальной матрицы.
    for (int j = 0; j < n; j++){
        arr[i][j] = rand() % 50;
        cout << arr[i][j] << "\t";
    }
    cout << "\n";
}

cout << "Select the number you want to shift by.\n";
cin >> k; //Число на которое будет выполнен сдвиг.
cout << "Now enter 1 to move the matrix to the right or 2 to move it down.\n";
cin >> side; //Выбор стороны

if (side==1){
    for (int c = 0; c < k; c++){
        for (int i = 0; i < m; i++){
            tmp = arr[i][n-1];
            for (int j = n; j > 0; j--){
                arr[i][j] = arr[i][j - 1];
            }
            arr[i][0] = tmp;
        }
    }
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            cout << arr[i][j] << "\t";
        }
        cout << "\n";
    }
}
else if (side == 2){
    for (int c = 0; c < k; c++){
            tmp = arr[m - 1][j];
            for (int i = m; i > 0; i--){
                arr[i][j] = arr[i - 1][j];
            }
            arr[0][j] = tmp;
        }
    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            cout << arr[i][j] << "\t";
        }
        cout << "\n";
    }
}
else{
    cout << "Error! You entered the wrong number.";
}
return 0;
}

Ответы (0 шт):