Форум программистов, компьютерный форум CyberForum.ru

Дано n различных чисел, напечатать все возможные перестановки этих чисел - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Моделирование работы сетевого протокола http://www.cyberforum.ru/cpp-beginners/thread276585.html
Доброго времени суток! Нужна ваша помощь.:) Необходимо разработать две программы, одна из которых будет посылать пакет, а другая - принимать. В качестве пакета используется файл со словом "привет" Заранее благодарен:)
C++ Моделирование работы концентратора Доброго времени суток! Необходимо объединить 4 компьютера в виде ячеек. Задача концентратора определять (указывать) адрес от кого, кому. К примеру нудно передать слово "привет":) Заранее благодарен:) Добавлено через 20 часов 51 минуту Помогите кто-то:) http://www.cyberforum.ru/cpp-beginners/thread276579.html
C++ Я новичек. Проверил силы - не работает прога
Добрый вечер. Я пару месяцев как начал изучать С++. Практически ничего не смыслю. Вот решил закрепить изученное, написал прогу, в которую вводиш оценки класса(в школе). Она в свою очередь должна была показать к-во учеников, которые учатся на низком, среднем, достаточном и высоком уровне знаний, коэф. наученности и качества, и сколько учеников на какую оценку учатся. Вот мое несчастье: ...
Параллельное вычисление C++
Вычислить площадь круга методом численного интегрирования, и необходима распараллелить хотя бы на 2 ядра помогите пожалуйста
C++ Динамическая память http://www.cyberforum.ru/cpp-beginners/thread276575.html
Здраствуйте!!!! Помогите выделить память под двумерные массив элементами которого являются слова. Было бы хорошо листинг программы. Очень надо.
C++ Проблема с перегрузками функций Описать класс с именем STUDENT, содержащий следующие поля: фамилия и инициалы;номер группы; успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия: а) ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT;записи должны быть упорядочены по возрастанию номера группы; б) вывод на дисплей фамилий и номеров групп для всех студентов,... подробнее

Показать сообщение отдельно
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
16.04.2011, 23:46     Дано n различных чисел, напечатать все возможные перестановки этих чисел
ща сделаю.

Добавлено через 1 час 26 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include<cstdio>
#include<cstdlib>
 
int askNumberOfElements()
{
    int ret;
    do
    {
        printf( "Vvedite k-vo elementov v masive: " );
        scanf_s("%d", &ret);
    }
    while(ret <= 0);
    return ret;
}
int* packArray(int elements)
{
    int* ret = (int*) malloc(elements * sizeof(int));
    for(int i = elements; i; --i)
    {
        printf( "Vvedite %d element massiva: ", elements - i + 1 );
        scanf_s("%d", ret + elements - i);
    }
    return ret;
}
 
bool isContain(int* array, int countOfElements, int requiredElement)
//функция поиска элемента в массиве
{
    for(int i = 0; i < countOfElements; ++i)
        if(array[i] == requiredElement)
            return true;
    return false;
}
void nextElement(int* usedElements, int countOfUsedElements, int& currentElement)
//функция перехода к следующему элементу.
{
    while(isContain(usedElements, countOfUsedElements, ++currentElement)) {   }
}
int firstElement(int* usedElements, int countOfUsedElements)
//Определяет, с какого элемента нацинать итерирование цикла.
{
    int currentElement = 0;
    while(isContain(usedElements, countOfUsedElements, currentElement))
        ++currentElement;
 
    return currentElement;  
}
void recursionPrintAllCombinationOfElemens(int* array, int elements, int countOfUsedElements = 0)
{
    /*
    вообще алгоритм мой тупорыл и состоит в следующем: заводится массив usedElements куда
    записывается номер элемента, который уже был включён в собираемый порядок следования.
    она объявлен как static, это значит что объявлен он будет только первый раз а не при
    каждом рекурсивном вызове функции. Далее если колличество записанных в массив использованных
    элементов не равно количеству элементов выводимого масива то входим в цикл по перебору
    всех неиспользованных элементов, каждый записывается в массив использованных элементов,
    после этого для него вызывается рекурсия.
    если число элементов в массиве использованных элементов равно числу элементов выводимого
    масива, т. е. достиднуто дно рекурсии(или пик, как привычнее) то вызывается цикл по
    выводу элементов исходного массива в соответствии с порядком, указанным в массиве использованных
    элементов. Если ваш препод - толстый троль, он может обратить внимание на то что вывод
    происходит не на этапе выхода из рекурсии а в отдельном цикле. Скажите ему что это вызвано
    спецификой моего алгоритма. и вообще если такой вопрос возникнет, знайте что вопрос этот
    сам по себе тупой, так как для реализации вывода на этапе выхода из рекурсии необходимо,
    так или иначе, вывести все собранные на верхних этажаэ элементы, а для этго всёравно
    нужен отдельный цикл.
    Недостаток алгоритма в том, что заводится дополнительный массив и по нему постоянно идёт
    пойск. Для учебной задачи такой недостаток не так уж и ужасен и кроме того, я пробовал
    гуглить на эту тему и альтернативных решений не нашел. вообще задача решается наилучшим
    образом не с помощью рекурсии а используя циклический подход. что, в целом, логично.
 
    Реализовано всё на чистом си, единственное - не уверен по поводу static. если его ваш
    препод не вытерпет(в нём нет ничего плохого, просто он может выходить за рамки преподаваемого
    материалла) то вынисите объявление usedElements или в глобальное пространство или в main
    */
    static int* usedElements = (int*) malloc(elements * sizeof(int));
    if(countOfUsedElements != elements)
        for(int i = firstElement(usedElements, countOfUsedElements); i < elements; nextElement(usedElements, countOfUsedElements, i))
        {
            usedElements[countOfUsedElements] = i;
            recursionPrintAllCombinationOfElemens(array, elements, countOfUsedElements + 1);
        }
    else
    {
        for(int i = 0; i < elements; ++i)
            printf("%d\t", array[usedElements[i]]);
        printf("\n");
    }
}
 
void main()
{
    int n = askNumberOfElements(),
      * m = packArray(n);
 
    printf("Vse vozmojnie kombinacii elementov:\n");
    recursionPrintAllCombinationOfElemens(m, n);
 
    free(m);
}
 
Текущее время: 06:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru