Запись одномерного массива в двумерный в разных комбинациях - 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.