Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет круговой сдвиг массива ВЛЕВО. Например :
Дан массив:
4 5 6 7
1 2 4 1
4 5 6 9
Сдвигаем на ДВА ВЛЕВО:
6 7 4 5
4 1 1 2
6 9 4 5
Срочно. Помогите пожалуйста написать правильный код без ошибок для Visual Studio 19 для C++.
НЕЙРОСЕТЬ НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗОВАТЬ!!!
Не копируйте коды с ошибками с интернета!
Иначе отправлю жалобу
C/C++
Количество кода можно было бы уменьшить, если убрать некоторые проверки входных данных и работать только с int матрицами.
Написать РЕКУРСИВНУЮ функцию, которая принимает двухмерный массив целых чисел и выполняет круговой сдвиг массива ВЛЕВО.
#include
#include
#include
#include
#include
typedef uint8_t byte;
void rotate(void* block, size_t capacity, size_t element_size, int shift) {
assert(block);
assert(element_size);
shift %= capacity;
if (shift && capacity > 1) {
byte* buffer = (byte*)malloc(element_size);
if (buffer) {
void* last = (byte*)block + ((capacity - 1) * element_size);
if (shift > 0) {
memcpy(buffer, last, element_size);
memmove((byte*)block + element_size, block, ((capacity - 1) * element_size));
memcpy(block, buffer, element_size);
rotate(block, capacity, element_size, shift - 1);
}
else {
memcpy(buffer, block, element_size);
memmove(block, (byte*)block + element_size, ((capacity - 1) * element_size));
memcpy(last, buffer, element_size);
rotate(block, capacity, element_size, shift + 1);
}
free(buffer);
}
}
}
void matrixRotate(void* matrix, uint32_t rows, uint32_t cols, size_t element_size, int shift) {
while (rows)
rotate((char*)matrix + (--rows * element_size * cols), cols, element_size, shift);
}
void matrixPrint(int* matrix, size_t cols, size_t rows) {
for (int i = 0; i < rows; i++) {
printf("%i", matrix[i * cols]);
for (int j = 1; j < cols; j++)
printf(", %i", matrix[i*cols+j]);
printf("\n");
}
printf("\n");
}
int matrix[5][5] = {
{0,1,2,3,4},
{5,6,7,8,9},
{9,8,7,6,5},
{4,3,2,1,0},
{0,0,1,0,0}
};
int main() {
matrixPrint((int*)matrix, 5, 5);
matrixRotate(matrix, 5, 5, sizeof(int), -2);
matrixPrint((int*)matrix, 5, 5);
}
Функция rotate является рекурсивнойКоличество кода можно было бы уменьшить, если убрать некоторые проверки входных данных и работать только с int матрицами.

Ернар Мамырбаев
Вот вариант без лишних проверок только для int'ов
#include
#include
using namespace std;
void shift_left_recursive(vector &matrix, int start_row, int start_col, int end_row, int end_col) {
if (start_row >= end_row || start_col >= end_col) {
return;
}
int prev = matrix[start_row][start_col];
for (int i = start_col + 1; i = start_row + 1; i--) {
swap(matrix[i][start_col], prev);
}
shift_left_recursive(matrix, start_row + 1, start_col + 1, end_row - 1, end_col - 1);
}
void rotate_left(vector& matrix, int shifts) {
int rows = matrix.size();
int cols = matrix[0].size();
for (int i = 0; i < shifts; i++) {
shift_left_recursive(matrix, 0, 0, rows - 1, cols - 1);
}
}
int main() {
vector matrix = {
{4, 5, 6, 7},
{1, 2, 4, 1},
{4, 5, 6, 9}
};
int shifts = 2;
rotate_left(matrix, shifts);
for (const auto& row : matrix) {
for (int element : row) {
cout
У меня gcc, так что можешь настучать.
Вот.
Вот.
#include
#include
#include
using namespace std;
void sdvig(int ** a, const int m, const int n, int q)
{
int tmp;
int z;
for(int x = 0; x < m; x++)
{
tmp = a[x][0];
for(int y = 0; y < n - 1; y++)
{
z = y + 1;
if(z == n)
z = 0;
a[x][y] = a[x][z];
}
a[x][n-1] = tmp;
}
if(q > 1)
sdvig(a, m, n, q - 1);
}
void printf(int ** a, const int m, const int n)
{
for(int x = 0; x < m; x++)
{
for(int y = 0; y < n; y++)
cout
Похожие вопросы
- Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет
- Рекурс.функцию, которая принимает 2х-мерный массив целых чисел и кол-во сдвигов и выполняет круговой сдвиг массива влево
- Как написать функцию которая вычисляет арктангенс из любого числа на c++ без использования библиотек
- Написал функцию, которая добавляет элемент в конец массива, как можно улучшить? Нули не учитываются.
- Помогите написать программу по обработке двухмерного массива в с++
- Как передать двухмерный массив в качестве аргумента через указатель.
- С++ Составить функцию, которая меняет местами пары соседних элементов в массиве
- Найти произведение элементов массива а, состоящего из 25 целых чисел, кратных 2 на Паскаль
- С++ | Надо отсортировать двухмерный массив N*M в порядке возрастания и спадания ПО КАЖДОМУ СТОЛБЦУ ОТДЕЛЬНО
- Задан одномерный массив целых чисел создать код на C++