Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Написать РЕКУРСИВНУЮ функцию, которая принимает двухмерный массив целых чисел и выполняет круговой сдвиг массива ВЛЕВО.

Владимир Пягай Ученик (12), закрыт 11 месяцев назад
Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет круговой сдвиг массива ВЛЕВО. Например :

Дан массив:

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++.

НЕЙРОСЕТЬ НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗОВАТЬ!!!

Не копируйте коды с ошибками с интернета!
Иначе отправлю жалобу
Дополнен 1 год назад
Этот вопрос не посвящается дуракам и школьникам!
Дополнен 1 год назад
Пожалуйста, помогите!
Дополнен 1 год назад
Спасибо за ответы
Лучший ответ
YOUNG SIDEWAYS Мастер (1469) 1 год назад
 #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 матрицами.
YOUNG SIDEWAYSМастер (1469) 1 год назад
 void rotate(int* block, int capacity, uint32_t shift) { 
if (shift) {
int buffer = block[capacity - 1];
memmove(block + 1, block, (capacity - 1) * sizeof(int));
*block = buffer;
rotate(block, capacity, shift - 1);
}
}
void matrixRotate(int* matrix, int cols, int rows, int shift) {
if (!shift)
return;
shift %= cols;
if (shift < 0)
shift = cols + shift;
while (rows)
rotate(matrix + (--rows * cols), cols, shift);
}
Вот вариант без лишних проверок только для int'ов
Остальные ответы
P̲u̲t̲ i̲n̲ Мудрец (13326) 1 год назад
 #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 <= end_col; i++) {
swap(matrix[start_row][i], prev);
}

for (int i = start_row + 1; i <= end_row; i++) {
swap(matrix[i][end_col], prev);
}

for (int i = end_col - 1; i >= start_col; i--) {
swap(matrix[end_row][i], prev);
}

for (int i = end_row - 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 << element << " ";
}
cout << endl;
}

return 0;
}
понял понял Мыслитель (7084) 1 год назад
У меня 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 << a[x][y] << '\t';
cout << endl;
}
cout << endl;
}

int main()
{
srand(time(nullptr));

int m,n,q,**a,x,y;

do
{
cout << "Количество строк = ";
cin >> m;
}while(m < 1);

do
{
cout << "Количество столбцов = ";
cin >> n;
}while(n < 1);

a = new int*[m];
for(x = 0; x < m; x++)
a[x] = new int[n];

for(x = 0; x < m; x++)
for(y = 0; y < n; y++)
a[x][y] = rand() % 9 + 1;

printf(a, m, n);

cout << "Количество позиций для сдвига влево = ";
cin >> q;
cout << endl;

sdvig(a, m, n, q);

printf(a, m, n);

if(a == (int**) nullptr)
exit(1);
for(x = 0; x < m; x++)
{
if(a[x] == (int*) nullptr)
exit(1);
delete [] a[x];
a[x] = (int*) nullptr;
}
delete [] a;
a = (int**) nullptr;

return 0;
}
Похожие вопросы