Запись одномерного массива в двумерный в разных комбинациях - C (СИ)
Формулировка задачи:
задача такая:
у нас есть отсортированный массив, из n эл-тов (например 6) и надо его забить в двумерный разными комбинациями, при этом порядок сортировки не должен нарушаться т.е:
исх массив 1,2,3,4,5,6
должны получить:
если выбираем разбить на 2:
123
124
125
126
134
135
136
145
146
156
234
235
236
245
246
256
345
346
456
если выбираем разбить на 3:
12
13
14
15
16
23
24
25
26
34
35
36
45
46
56
параметр n может быть разный и деления тоже могут быть разными на пары, тройки, четверки и тд
подскажите кто нибудь плз..а то уже третий день сижу над этим
Решение задачи: «Запись одномерного массива в двумерный в разных комбинациях»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> void Recursion(int *, int, int, int *, int, int) int main() { //В main'е пояснять нечего, я думаю. Всего лишь массивы динамически выделяются. int * Array; int i, SizeOfArray, SplitNumber; printf("Input size of array: "); scanf("%d", &SizeOfArray); Array = (int*)malloc(SizeOfArray * sizeof(int)); for(i = 0; i < SizeOfArray; i++) { Array[i] = i + 1; } printf("Input number of split: "); scanf("%d", &SplitNumber); int * String; String = (int*)malloc(SplitNumber * sizeof(int)); Recursion(Array, 0, SplitNumber - 1, String, SizeOfArray, SplitNumber); free(Array); free(String); Array = NULL; String = NULL; } void Recursion(int * Array, //Массив int index, //Текущий индекс int deep, //Глубина рекурсии int * String, //Строка на вывод int SizeOfArray, //Размер массива int SplitNumber) //Количество разбиений { int i = 0; //Просто счётчик //Смысл такой, инициируем внешний цикл, из него вызываем несколько внутренних, //Пока глубина рекурсии не достигнет нужной. //Потом начинаем выводить всё, что получилось. //Каждый следующий цикл начинается со следующих элементов массива for(index; index < SizeOfArray - deep; index++) { //В строку помещаем элемент на текущем уровне рекурсии String[SplitNumber - 1 - deep] = Array[index]; //Если уровень ненулевой, то вызываем функцию из самой себя, if(deep != 0) { //но со следующего индекса и уровнем рекурсии меньше на единицу Recursion(Array, index + 1, deep - 1, String, SizeOfArray, SplitNumber); } //Дошли до нулевого уровня, выводим. else { for(i = 0; i < SplitNumber; i++) { printf("%d", String[i]); } printf("\n"); } } }
Объяснение кода листинга программы
- Объявлены внешние переменные:
- int * Array;
- int i, SizeOfArray, SplitNumber;
- int * String;
- В main() выполняются следующие действия:
- Выделяется динамическая память под массив Array;
- В цикле заполняются элементы массива значениями от 1 до SizeOfArray;
- Затем запрашивается количество разбиений SplitNumber;
- Выделяется динамическая память под массив String;
- Вызывается функция Recursion() с аргументами Array, 0, SplitNumber - 1, String, SizeOfArray, SplitNumber;
- Освобождается память, выделенная под массив Array;
- Освобождается память, выделенная под массив String;
- Array и String устанавливаются в значение NULL.
- В функции Recursion() выполняются следующие действия:
- Если deep = 0, то выводится строка, сформированная из элементов массива;
- Если deep > 0, то выполняется рекурсивный вызов функции Recursion() с аргументами Array, index + 1, deep - 1, String, SizeOfArray, SplitNumber;
- Цикл for генерирует строку, которая передается в рекурсивный вызов;
- Переменная i инициализируется значением 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д