Определение стуктуры для построения всех комбинаторных объектов на примере стуктуры BinarySequence (построение всех двоичных последовательностей заданной длины):
#include<iostream>
using namespace std;
struct BinarySequence
{
int n; // Длина последовательности
int * elems; // Массив для хранения элементов последовательности
void SetFirst() // Данный метод генерирует самую первую
{ // последовательность - из одних нулей
for(int i=0;i<n;++i)
elems[i]=0;
}
void SetLast() // Данный метод генерирует самую последнюю
{ // последовательность - из одних единиц
for(int i=0;i<n;++i)
elems[i]=1;
}
BinarySequence() // Конструктор по умолчанию - создается
{ // последовательность длины 1
n=1;
elems=new int[1];
SetFirst();
}
BinarySequence(int size) // Конструктор для создания последовательности
{ // заданной длины
n=size;
elems=new int[n];
SetFirst();
}
~BinarySequence() // Деструктор для корректного освобождения памяти
{ // Вызывается автоматически при удалении объекта
delete elems;
}
bool Next () // Данный метод генерирует из текущей строки следующую
// и возвращает true, если это удалось, иначе false
{ // КОД НАПИШИТЕ САМИ
}
bool Previous () // Данный метод генерирует из текущей строки предыдущую
// и возвращает true, если это удалось, иначе false
{ // КОД НАПИШИТЕ САМИ
}
};
// Теперь определяем вывод на экран
ostream & operator<<(ostream & out, const BinarySequence & Seq)
{
for(int i=0;i<Seq.n;++i)
out<<Seq.elems[i];
return out;
}
int main()
{
int n;
cin>>n; // Считали n - длину строки
BinarySequence Seq(n); // Создали объект для строк длины n
do
{
cout<<Seq<<endl; // Выводим последовательность на экран
}
while( Seq.Next() ) // И генерируем следующую строку пока возможно
return 0;
}
0011
0101
0110
1001
1010
1100
123
132
213
231
312
321
Пример:
Вход
aab
aba
baa
aaa
Выход
aba
baa
aab
aaa
Вход
5 2
Выход
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
Вход
5 2
Выход
2 1
3 1
3 2
4 1
4 2
4 3
5 1
5 2
5 3
5 4
Выведите все разбиения в лексикографическом порядке. Пример:
Вход
5
Выход
1 1 1 1 1
2 1 1 1
2 2 1
3 1 1
3 2
4 1
5
Вход
5
Выход
5
4 1
3 2
3 1 1
2 2 1
2 1 1 1
1 1 1 1 1
Вход
5
Выход
1 1 1 1 1
1 1 1 2
1 1 3
1 2 2
1 4
2 3
5
Вход
5
Выход
5
2 3
1 4
1 2 2
1 1 3
1 1 1 2
1 1 1 1 1
Вход
8
Выход
92
Также напишите программу, которая будет выводить все возможные расстановки.
Вход
8
Выход
12