Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.09.2019
Сообщений: 18

Перестановки с одни условием

14.06.2020, 13:08. Показов 859. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вообщем стоит задача вывести все перестановки массива n, в котором каждая n[i] = i; то есть если вводится число 4,
значит массив состоит из чисел 1 2 3 4. прикол в том, что нужно выводить только те перестановки, в которых все числа не отличаются от соседних больше чем на 3. у меня есть код на cpp, который выводит просто все перестановки, а хотелось бы видеть только правильные перестановки(заодно и оптимизацию повысить). кто сможет помочь?
#include <bits/stdc++.h>
using namespace std;
void display(vector<int> a, int n){
for(int i=0;i<n;i++) cout << a[i] << " ";
cout << endl;
}
int main()
{
int n;
cin >> n;
vector<int> a(n);
for(int i=0; i<n; i++){
a[i] = i+1;
}
do{
display(a, n);
}while(next_permutation(a.begin(), a.end()));
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.06.2020, 13:08
Ответы с готовыми решениями:

Распечатать перестановки с условием
Даны цифры 1 2 3 4 5 6. Требуется распечатать все перестановки из этих цифр с условием, что 1) 1 стоит левее 2 2) 3 стоит левее 4 ...

Перестановки: чтобы любые две соседние перестановки отличались только порядком двух соседних элементов
Вводится число n &lt;= 8. Вывести все перестановки чисел 1,2..,n, так, чтобы две любые две соседние перестановки отличались только порядком...

Цикл с пред условием и пост условием: табулирование функций
составить цикл с пред условием и пост условием y=8{x}^{3}-2{x}^{2}+sin(x/2) nx=-20 xk=20 h=0.2

5
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
14.06.2020, 15:14
Т.к. пермутация частный случай комбинации, можно чё-нить такое изобразить:
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
class Combination
{
    int* pData;
    int* pIndSeq;
    bool* mem;
    const int N;
 
 
private:
    void cout() {
        for (int i{}; i < N; ++i) {
            std::cout << pData[pIndSeq[i]] << ' ';
        }
        std::cout << '\n';
    }
 
    void foo(int k = 0) {   // without repetition = n! / (n - k)!
        if (k == N) return cout();
        for (int i{}; i < N; ++i) {
            if (mem[i] || (k && abs(pData[pIndSeq[k - 1]] - pData[i]) > 3)) continue;
            pIndSeq[k] = i;
            mem[i] = true;
            foo(k + 1);
            mem[i] = false;
        }
    }
 
 
public:
    ~Combination() {
        delete[] pIndSeq;
        delete[] mem;
    }
 
    Combination(int n, int* data) :
        pData(data),
        pIndSeq(new int[n] {}),
        mem(new bool[n] {}),
        N(n)
    {}
 
    void operator ()() {
        foo();
    }
};
 
 
int main()
{
    int data[]{ 4, 3, 6, 9 };
 
    Combination(std::size(data), data)();
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 21.09.2019
Сообщений: 18
14.06.2020, 15:20  [ТС]
Спасибо большое! Но
можно пожалуйста комменты с обьяснениями в код добавить? А то я еще так не шарю)
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
14.06.2020, 15:25
Цитата Сообщение от Темирмемир Посмотреть сообщение
нужно выводить только те перестановки, в которых все числа не отличаются от соседних больше чем на 3.
так а других и быть не может

Добавлено через 1 минуту
nalbe666, по-моему, вы переусложняете проблему
0
0 / 0 / 0
Регистрация: 21.09.2019
Сообщений: 18
14.06.2020, 15:28  [ТС]
может, допустим один из вариантов перестановок для n = 5: 2 3 4 1 5 -> разница между 1 и 5 больше 3

Добавлено через 55 секунд
возможно, тогда обьясните пожалуйста почему и как можно оптимизировать мой код так чтобыон мог работать при n = 15
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
14.06.2020, 15:42
Kuzia domovenok, очень может быть.
Я себе накидал памятку для комбинаций на все случаи жизни. Так что код выше, это она с небольшими изменениями.
Combinations

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>
#include <iterator>
 
 
class Combination
{
    int* pData;
    bool* mem;
    const int N;
    const int K;
 
 
private:
    void cout() {
        std::copy(pData, pData + K, std::ostream_iterator<int>(std::cout, ""));
        std::cout << '\n';
    }
 
 
    // https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5
    void foo1(int k = 0) {  // with repetition = n^k
        if (k == K) return cout();
        for (int i(0); i < N; ++i) {
            pData[k] = i + 1;
            foo1(k + 1);
        }
    }
 
    void foo2(int k = 0) {  // without repetition = n! / (n - k)!
        if (k == K) return cout();
        for (int i(0); i < N; ++i) {
            if (mem[i]) continue;
            pData[k] = i + 1;
            mem[i] = true;
            foo2(k + 1);
            mem[i] = false;
        }
    }
 
 
    // https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D0%B5
    void bar1(int k = 0, int m = 0) {   // with repetition = (n + k - 1)! / (k! * (n - 1)!)
        if (k == K) return cout();
        for (int i(m); i < N; ++i) {
            pData[k] = i + 1;
            bar1(k + 1, i);
        }
    }
 
    void bar2(int k = 0, int m = 0) {   // without repetition = n! / (k! * (n - k)!)
        if (k == K) return cout();
        for (int i(m); i < N; ++i) {
            pData[k] = i + 1;
            bar2(k + 1, i + 1);
        }
    }
 
 
public:
    ~Combination() {
        delete[] pData;
        delete[] mem;
    }
 
    Combination(int n, int k) :
        pData(new int[k] {}),
        mem(new bool[n] {}),
        N(n), K(k)
    {}
 
    void operator ()(int t) {
        if (t == 1) foo1();
        if (t == 2) foo2();
        if (t == 3) bar1();
        if (t == 4) bar2();
    }
};
 
 
int driver() {
    int n = 5, k = 3;
    Combination(n, k)(4);
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2020, 15:42
Помогаю со студенческими работами здесь

Нужна прога с пред условием и пост условием и циклом
Написать прогу с-пред пост условием и циклич. Дано натуральное n, и действительное Х вычислить : Sin X +SinSin X+SinSinSin X+.... ...

Решить уравнение с пред условием, пост условием и со счетчиком
Здраствуйте,паскаль я начал изучать недавно,почти ничего непонимаю,уравнение примерно такое S=2+2\(x-4)-3\(x+9)+4\(x-16)-.... надо решить с...

Выводяться одни и те же значения
Код записывает значения в обьект (это работает в цикле), puts - выводит разные значения. char * daName; daName...

На флешке одни ярлыки
На флешке все файлы ярлыки. Пробовал методы из интернета, но все равно остается все тоже. Удалял даже это файл вирус, но он откуда-то опять...

Ходите ли вы в кино одни?
Я люблю ходить в кино один. Почти всегда ходил в кино с друзьями, но могу сказать так: поржал конечно хорошо, но атмосферой фильмов не...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru