С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 19.03.2019
Сообщений: 2
1

Генерация перестановок чисел от 1 до N

08.12.2019, 02:49. Показов 4404. Ответов 1

Author24 — интернет-сервис помощи студентам
Данная программа выдает неверные данные при N=5 и более.Сдается мне что есть проблемы в сортировке. Работает по следующему алгоритму:

1.Необходимо просмотреть текущую перестановку справа налево и при этом следить за тем, чтобы каждый следующий элемент перестановки был не более чем предыдущий . Как только данное соотношение будет нарушено необходимо остановиться и отметить текущее число.

2.Снова просмотреть пройденный путь справа налево пока не дойдем до первого числа, которое больше чем отмеченное на предыдущем шаге.

3.Поменять местами два полученных элемента.

4.Теперь в части массива, которая размещена справа от элемента,найденного в первом пункте, надо отсортировать все числа в порядке возрастания. То есть необходимо эту часть просто перевернуть.


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
#include <iostream>
 
using namespace std;
 
int main(){
 
 
    int n;
    setlocale(LC_ALL, "Russian");
 
 
    cout<<"Введите порядок числа: ";
    cin>>n;
    int a[n];
    int k;//флажок
    int o=1;//для нумерации перестановке в выводе
    
    
    for(int i=0;i<n;i++){
        a[i]=i+1;
    }
    
    
    cout<<"№"<<" "<<o<<" :";
    for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
    }
    
    
        do  {
                int j=-1;// индекс для фиксации искомого номера элемента из пункта 1.
            k=0;
            for(int i=n-1;i>0;i--){
            
            if(a[i]>=a[i-1]){
                k=1;
                 j=i-1;
                break;
            } //зафиксировали
        
        }
            
        
        
            
            if(j!=-1){
            
            for(int i=n-1;i>=0;i--){
            if(a[i]>a[j]){
            
            
                int temp=0;
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                cout<<"\n";
                break;
    
    } //Нашли первый элемент,больший элемента из п.1 и поменяли местами
        
}
        
                
                int m=1;
                for(int i=j+1;i<(n-1);i++){
 
                swap(a[i],a[n-m]);
                m++;
                    } //реверсируем часть массива,которая справа от элемента из п.1
            
                o++;
                cout<<"№"<<" "<<o<<" :";
                for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
                
                    } //Вывели перестановку
            }
            
 
                    
            
 
                                } while(k!=0);
                
        return 0;   }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2019, 02:49
Ответы с готовыми решениями:

Генерация перестановок. Что не так?
Подскажите, пожалуйста, почему не работает, эта программа должна генерировать все перестановки ...

Генерация всех перестановок n элементного множества
с++ 1) Напечатать все перестановки чисел от 1 до n используя рекурсивный алгоритм пример 123...

Генерация массива всех перестановок из n элементов.
Нашел по этой теме здесь на форумах такой код: #include &lt;iostream.h&gt; int X; int N; void...

Генерация всех перестановок заданного множества
Никак не могу понять в чем проблема, задача состояла в генерации всех перестановок заданного...

1
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
08.12.2019, 21:59 2
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
#include <stdio.h>
#include <stdbool.h>
 
void iter_swap(int* l, int* r) {
    if (*l != *r) {
        *l ^= *r; *r ^= *l; *l ^= *r;
    }
}
 
void reverse(int* begin, int* end) {
    if (begin < end - 1) {
        iter_swap(begin, end - 1);
        reverse(++begin, --end);
    }
}
 
bool next_permutation(int* begin, int* end) {
    int* next = end;
    if (begin == end || begin == --next) {
        return false;
    }
 
    while (true) {
        int* next1 = next;
        if (*--next < *next1) {
            int* mid = end;
            do {
                --mid;
            } while (*next >= *mid);
 
            iter_swap(next, mid);
            reverse(next1, end);
            return true;
        }
 
        if (next == begin) {
            reverse(begin, end);
            return false;
        }
    }
}
 
bool prev_permutation(int* begin, int* end) {
    int* next = end;
    if (begin == end || begin == --next) {
        return false;
    }
 
    while (true) {
        int* next1 = next;
        if (*next1 < *--next) {
            int* mid = end;
            do {
                --mid;
            } while (*mid >= *next);
 
            iter_swap(next, mid);
            reverse(next1, end);
            return true;
        }
 
        if (next == begin) {
            reverse(begin, end);
            return false;
        }
    }
}
 
int main() {
    int seq[] = { 1,2,3,4 };
 
    do {
        printf("%d %d %d %d\n", seq[0], seq[1], seq[2], seq[3]);
    } while (next_permutation(seq, seq + 4));
 
    return 0;
}
0
08.12.2019, 21:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2019, 21:59
Помогаю со студенческими работами здесь

Генерация всех перестановок n-элементного множества за минимальное количество перестановок (Алгол60 -> Дельфи)
Искал по книгам код для данной задачи: Разработать алгоритм генерации всех перестановок...

Генерация перестановок.
Написать рекурсивную программу, которая печатала бы все перестановки чисел 1..n по одному разу

Генерация перестановок
Написал программу, но она работает не правильно procedure generate (l,r:integer); var ...

Генерация перестановок
Привет, я написал прогу для вывода в файл всех перестановок ряда чисел 1,2, ... ,n. Число n можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru