Top.Mail.Ru
Ответы
Аватар пользователя
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Задание 4 по Теме Функции. Перегрузка Функций. Рекурсия. На языке программирования C++

Пожалуйста. Помогите мне написать рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет круговой сдвиг массива ВНИЗ.
Например:

Дан массив:

4 5 6 7
1 2 4 1
4 3 6 8

Сдвигаем ВНИЗ НА ОДИН (должно быть потом вот так):

4 3 6 8
4 5 6 7
1 2 4 1

ПРОСЬБА, НЕЙРОСЕТЬ НЕ ИСПОЛЬЗОВАТЬ!!!

НЕ КОПИРОВАТЬ НЕРАБОТАЮЩИЕ КОДЫ С++ С ИНТЕРНЕТА!

Читайте внимательно задание. И помогите мне с этим

Дополнен

Дураки исключаются в моём вопросе

Дополнен

Спасибо за ответы!

По дате
По рейтингу
Аватар пользователя
Новичок
1234567891011121314151617181920212223242526272829303132333435363738
 #include <iostream> 
#include <iomanip> 
using namespace std; 
 
void scroll(int** arr, size_t str, int dist) 
{ 
	if (dist > str) dist = dist % str; 
	if (!dist) return; 
	for (size_t i = str - 1; i > 0; i--) swap(arr[i], arr[i - 1]); 
	scroll(arr, str, dist - 1); 
} 
void print(int** arr, size_t str, size_t col) 
{ 
	for (size_t i = 0; i < str; i++) 
	{ 
		for (size_t j = 0; j < col; j++) cout << setw(6) << left << arr[i][j]; 
		puts(""); 
	} 
} 
 
int main() 
{ 
	size_t str, col, dist; 
	puts("Enter array sizes: str and col"); 
	cin >> str >> col; 
	int** arr = new int* [str]; 
	arr[0] = new int[str * col]; 
	for (size_t i = 1; i < str; i++) arr[i] = arr[0] + i * col; 
	puts("Enter elements"); 
	for (size_t i = 0; i < str * col; i++) cin >> arr[0][i]; 
	puts("Your arr:"); 
	print(arr, str, col); 
	puts("Enter dist:"); 
	cin >> dist; 
	scroll(arr, str, dist); 
	puts("Your arr:"); 
	print(arr, str, col); 
} 
Аватар пользователя
Мастер
1234567891011121314151617181920212223242526272829303132333435363738394041
 #include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
typedef unsigned char byte; 
 
void rotate(int* matrix, int rows, int cols, int shift) { 
	shift %= rows; 
	if (shift < 0) 
		shift += rows; 
	if (shift) { 
		void* buffer = malloc(sizeof(int) * cols); 
		if (buffer) { 
			memcpy(buffer, matrix + ((rows - 1) * cols), sizeof(int) * cols); 
			memmove(matrix + cols, matrix, (rows - 1) * cols * sizeof(int)); 
			memcpy(matrix, buffer, sizeof(int) * cols); 
			free(buffer); 
			rotate(matrix, rows, cols, shift - 1); 
		} 
	} 
} 
void print(int* matrix, int cols, int 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[3][3] = { 
	{0,1,0}, 
	{1,0,1}, 
	{0,1,0}, 
}; 
 
int main() { 
	print((int*)matrix, 3, 3); 
	rotate((int*)matrix, 3, 3, -1); 
	print((int*)matrix, 3, 3); 
} 
Аватар пользователя
Мудрец
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
 #include <iostream> 
#include <vector> 
 
void shiftDown(std::vector<std::vector<int>>& matrix, int shifts) { 
    if (shifts < 0) { 
        std::cerr << "Number of shifts must be non-negative" << std::endl; 
        return; 
    } 
 
    int rows = matrix.size(); 
    if (rows == 0) return; 
 
    int cols = matrix[0].size(); 
 
    shifts %= rows; // Оптимизация, чтобы избежать лишних повторений 
    if (shifts == 0) return; 
 
    for (int s = 0; s < shifts; s++) { 
        for (int col = 0; col < cols; col++) { 
            int tmp = matrix[rows - 1][col]; 
            for (int row = rows - 1; row > 0; row--) { 
                matrix[row][col] = matrix[row - 1][col]; 
            } 
            matrix[0][col] = tmp; 
        } 
    } 
} 
 
int main() { 
    std::vector<std::vector<int>> matrix = { 
        {4, 5, 6, 7}, 
        {1, 2, 4, 1}, 
        {4, 3, 6, 8} 
    }; 
 
    int shifts = 1; 
    shiftDown(matrix, shifts); 
 
    for (const auto& row : matrix) { 
        for (int val : row) { 
            std::cout << val << ' '; 
        } 
        std::cout << std::endl; 
    } 
 
    return 0; 
}