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

Размещение с повторением элементов

10.12.2014, 16:24. Показов 3105. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.

Пытаюсь сделать проект, в котором ко всему прочему нужно инициализировать множество. Даны 3 элемента - A, B, C.
Пользователь вводит число n >= 3. Мне нужно сгенерировать все возможные комбинации с повторением трех элементов (A, B, C) и вставить их во множество vector<string> ... .
Например: n = 5
Возможные варианты: AAAAA AAAAB (...) BBBBB BBBBC (...) CCCCC

Мой вариант с отдельной функцией: (весь проект выкладывать смысла нет, множество от него не зависит)
Проблемы:
1. Функция void просто делает что-то, не выдавая мне вектор для дальнейшего использования.
На что нужно заменить void? (Вариант vector<string> и в конце return vektor так же не дал результатов. Отображается пустое множество
2. После 4 нужных мне комбинаций в векторе появляются 1-2 пустых множества
3. Можно ли как-то интегрировать это все в main, или только вариант с отдельной функцией и ее вызовом?

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
#include <iostream>
#include <sstream>
#include <vector>
 
using namespace std ;
void perm ( string str, vector<string> vek, int pos, int n )
{
    if( pos > n )
        vek.push_back ( str ) ;
 
    else
    {
        for( size_t i = 0; i < 3; ++i )
        {
            ostringstream ostr;
 
// можно ли это сделать более элегантно?
            if( i == 0 )
                ostr << 'A';
            else if ( i == 1 )
                ostr << 'B' ;
            else
                ostr << 'C' ;
 
            perm( perm + ostr.str() + " ", vek, pos + 1, n ) ;
        }
    }
// return vek ;
}
 
int main()
{   
    vector<string> vek ; 
    int n = 5;
    perm( " ", vek, 1, n ) ;
 
 
    return 0;
}
Добавлено через 7 минут
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
perm( perm + ostr.str() + " ", vek, pos + 1, n ) ;
C++
1
2
// ошибка
 perm( str + ostr.str() + " ", vek, pos + 1, n ) ;
Добавлено через 8 минут
C++
1
2
Output:
1 [ A A A A A ][ A A A A B ][ A A A A C ][][ A A A B A ][ A A A B B ][ A A A B C ][][ A A A C A ] ...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.12.2014, 16:24
Ответы с готовыми решениями:

Размещение с повторением n по k. C++
HELP! Даны 2 числа n и k,нужно распечатать все размещения с повторением n по k. Пример k=4 n=3 Вывод : 1111 1112

Размещение с повторением в MathCaD
Здравствуйте ! Необходимо создать Программу генерации всех возможных сочетаний варьирования n переменных на m уровнях. Т.е программа...

Размещение элементов
Что из grid() pack() и place() удобнее и понятнее использовать. И еще - если создать Text то его границы будут изменятся автоматически под...

15
1 / 1 / 0
Регистрация: 03.07.2014
Сообщений: 13
16.12.2014, 22:01  [ТС]
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
#include <iostream>
#include <sstream>
#include <vector>
 
using namespace std ;
vector<string> perm ( string str, vector<string> vek, int pos, int n )
{
    if( pos > n )
        vek.push_back ( str ) ;
 
    else
    {
        for( char i = 'A'; i < 'D' ; ++i )
            perm( str + i + " ", vek, pos + 1, n ) ;
 
    }
    // Проблема с пустыми множествами осталась как и в первом варианте
    // vek[ 3 ]...[ 7 ] ... [ 11 ] [ 12 ] ... пустые, независимо от n
    cout << vek ;
    return vek ;
}
 
int main()
{   
    vector<string> vek ; 
    int n = 5;
    perm( " ", vek, 1, n ) ;
     
    // vek тут показан пустым
    cout << vek ;
 
    return 0;
}
Добавлено через 5 часов 15 минут
Если перед
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
vek.push_back ( str ) ;
ввести cout << str , то видно что в str как раз то, что нужно. Пустые множества возникают при вызове
push_back()
Как от них избавиться?

Добавлено через 1 час 36 минут
Функция работает как нужно, но vek в main остается пустым... Как сделать что бы все комбинации в нем сохранились?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.12.2014, 22:45
Julia_Tallo, с техникой векторов не слишком знаком, и, возможно, мои соображения покажутся вам не интересными. Но хочу обратить ваше внимание вот на что. Все ваши комбинации есть просто все 5-ти значные числа в троичной системе счисления. (ну или N-значные в k-ичной с/с) Генерируются все такие числа очень не сложно (прибавление 1 столбиком - детский алгоритм). Так может есть смысл сделать все попроще? Вам нужно все комбинации хранить? Так и объем известен. Ровно Nk комбинаций. Выделяете необходимую память, заполняете - пользуйтесь!
Однако, сдается мне, что хранить ваши комбинации - все равно, что хранить натуральные числа от 1 до ... чего нужно. ИМХО, никто еще этого не делал. Может быть имеет смысл взглянуть на ваш проект чуть-чуть с другой стороны?
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
16.12.2014, 22:54
Лучший ответ Сообщение было отмечено Julia_Tallo как решение

Решение

C++ (Qt)
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
#include <iostream>
#include <sstream>
#include <vector>
 
using namespace std;
 
vector<string> res;
 
void rec(string s, int pos, int n);
 
vector<string> get_perms(int n)
{
    res.clear();
 
    rec("", 0, n);
 
    return res;
}
 
void rec(string s, int pos, int n)
{
    if(pos >= n)
    {
        res.push_back(s);
        return;
    }
 
    for(char c = 'A'; c <= 'C'; c++)
    {
        rec(s + c, pos + 1, n);
    }
 
    return;
}
 
int main()
{   
    
    int n;
    cin >> n;
 
    vector<string> p = get_perms(n);
    cout << p.size() << endl;
    for(int i = 0; i < p.size(); i++)
        cout << p[i] << endl;
    cout << endl;
 
    return 0;
}
3
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
17.12.2014, 00:08
Солидарен с Байт
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
17.12.2014, 00:19
Цитата Сообщение от _Ivana Посмотреть сообщение
Солидарен с Байт
Так и подмывало поставить за это "Лучший ответ!", но вспомнил, что мэтры обычно проходят мимо решенных задач. А задача, ИМХО, не решена, и ТС корчится в муках выбора.
Тем не менее, благодарен за поддержку.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
17.12.2014, 00:26

Не по теме:

Байт, эдак мы с вами можем сговориться и работая синхронно поднять репы каждого до невиданных доселе на форуме высот, хотя у вас уже и так не маленькая :D Но что же остается делать, если ваш ответ в этой теме (и не только в этой) действительно заслуживает :)



Добавлено через 2 минуты

Не по теме:

ЗЫ а тут и SlavaSSU тоже не грех плюсануть за честную красивую рекурсию :) Куда ни глянь - все прекрасно! :)

1
17.12.2014, 00:35

Не по теме:

_Ivana, Спасибо на добром слове. И ваш оптимизм меня чрезвычайно радует. Нонче это - редкость.:)

0
1 / 1 / 0
Регистрация: 03.07.2014
Сообщений: 13
17.12.2014, 01:42  [ТС]
Проблема решена второй функцией get_perm, как написал SlavaSSU
Спасибо.

Не по теме:


Байт, это лишь маленькая часть всего проекта
Проблема не в выделении памяти - вектор делает это автоматически. И сами комбинации генерировались без проблем и в моем случае.
Проблема была в том, что я впервые столкнулась с рекурсией и не сделала "дополнительную функцию для вызова функции", поэтому и возникали ошибки.

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
17.12.2014, 12:26
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
Проблема не в выделении памяти - вектор делает это автоматически
Но все-таки память выделяется! А вы уверены, что он делает это оптимальным образом?
Понимаете, я не вижу особого смысла держать в памяти последовательность целых чисел в естественном порядке (вида 0 1 2 3 ...). Если, конечно, в процессе работы они не заменяются на что-то более содержательное. А любая ваша "комбинация" взаимно однозначно сопоставляется с целым числом. И все векторные операции-иттерации легко интерпретируются как операции над целым числом вообще без всякой памяти!
Впрочем, проект ваш, вам и решать.
А меня - простить за возможно нелепые советы.
0
17.12.2014, 18:41  [ТС]

Не по теме:

Проблема вообще не в выделении памяти, как я уже писала.
Мы не понимаем друг друга и я не могу оценить Вашу идею потому что Вам не известна суть проекта, а я думаю в своем направлении, т.к. сроки сдачи поджимают :)

Мне нужен был именно этот вектор, именно с этими данными, именно в виде букв что бы продолжить.

Цитата Сообщение от Байт Посмотреть сообщение
последовательность целых чисел в естественном порядке (вида 0 1 2 3 ...)
Про это речи не шло. Мне нужны все возможные n-значные комбинации 3х букв
Каждая комбинация имеет свой номер и доступна в любой момент для дальнейших операций.

0
17.12.2014, 19:12

Не по теме:

Цитата Сообщение от Julia_Tallo Посмотреть сообщение
т.к. сроки сдачи поджимаю
Все понятно, и вам сейчас не до грошовой оптимизации. Поэтому больше не буду отнимать вашего драгоценного времени. Даже если мой подход окажется изящнее и эффективнее, в данном случае оно не стоит того.
Давайте договоримся так. Если после успешной сдачи проекта (чего от всей души вам желаю) и заслуженного отдыха у вас не пропадет любопытство к моим идеям и предложениям ( а в коде это всего несколько строк), просто черкните в эту тему. Пропадет любопытство - тоже не беда! Найду другие приложения своему интеллекту.:) Тем более, что у меня тоже проект горит. Скушный - до зубной боли. Вот я и пытаюсь капельку развлечься.
Еще раз удачи!

0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
17.12.2014, 23:13
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
Про это речи не шло. Мне нужны все возможные n-значные комбинации 3х букв
Каждая комбинация имеет свой номер и доступна в любой момент для дальнейших операций.
Это у вас не шло, а у нас с Байт очень даже шло - функция в 2 строчки, выдает комбинацию любого порядкового номера, безо всяких ненужных векторов и массивов:
C++
1
2
3
4
5
6
7
8
9
10
11
void comb3(int n, int m, char *ps)
{   char *p = ps+m; *p-- = 0;
    for (int i=0; i<m; i++) {*p-- = 'A' + n%3; n /= 3;}
}
int _tmain(int argc, _TCHAR* argv[])
{
    char s[6];
    for (int i=0; i<243; i++) {comb3(i, 5, s); cout<< i <<" - "<< s <<endl;}
    system("pause");
    return 0;
}
1
1 / 1 / 0
Регистрация: 03.07.2014
Сообщений: 13
18.12.2014, 23:48  [ТС]
m вводится пользователем. Поэтому ограничение i<243 никак не подойдет

И я правильно поняла, что после вывода на мониторе, s каждый раз перезаписывается?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
19.12.2014, 00:04
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
m вводится пользователем. Поэтому ограничение i<243 никак не подойдет
Вы "делаете сложный проект", но не можете посчитать 3^m, где m вводится пользователем? Может для начала попробовать порешать задачки "2+2=?"
Цитата Сообщение от Julia_Tallo Посмотреть сообщение
И я правильно поняла, что после вывода на мониторе, s каждый раз перезаписывается?
Правильно. Но это только в данном тестовом примере был реализован такой вызов функции. В саму же функцию передается указатель - что передадите, туда и запишет, это вообще не принципиальный момент.
0
1 / 1 / 0
Регистрация: 03.07.2014
Сообщений: 13
19.12.2014, 00:57  [ТС]
Я б с удовольствием, только задачи 2+2 никто не ставит И "сложность" проекта - Ваши догадки.

Что бы оптимизировать, надо написать const& при вызове в
Цитата Сообщение от SlavaSSU Посмотреть сообщение
vector<string> p = get_perms(n);
Спасибо за Ваш вариант без рекурсии.
Но все же не обойтись без вектора На нем половина задания завязана.

Считаю дальнейшее обсуждение лишним, проблема решена легко и элегантно -
лишнюю память не занимает, указатель делается в main, как я выше написала.

Остальное не оптимизирует процесс или оптимизация будет минимальной.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2014, 00:57
Помогаю со студенческими работами здесь

Размещение элементов
Возможно ли поместить картинку в любое место? В том числе и на текст, чтобы другие элементы/текст не сдвинулись. Как это сделать?

Размещение элементов на JFrame
Подскажите пожалуйста, какой параметр необходимо поменять чтобы элементы на фрейме не зависели друг от друга? К примеру, если я хочу...

Размещение элементов в массиве
Задача: Разместить все элементы с нулевым значением в левой части массива, элементы с негативными значением за ними, а за ними - элементы...

Автоматическое размещение элементов
Когда нужно использовать автоматическое размещение элементов, и почему у элементов, внесенных в QBoxLayout, не очищается память? ...

Динамические размещение элементов
Здравствуйте. Есть некие блоки в диве размер которого не известен. Блоки размещены с строку, а когда не влазят переходят на следующую...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru