Перестановка в лексикографическом порядке

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Аватара пользователя
Balbec
Сообщения: 34
Зарегистрирован: 15 янв 2008, 20:22

При генерации сочетаний, задавать с клавиатуры мощность множества и мощность выборки . Исходное множество задается произвольно.

При генерации перестановок с клавиатуры задается мощность множества. Исходное множество задается произвольно.

Есть программа, сам её написал, но не принимают, говорят в закоментированном цикле ошибка.

Вот алгоритм и код программы :)

Будем рассматривать исходное множество , и в ка-честве начальной перестановки возьмем . Условие окон-чания работы — порождение перестановки , которая является последней в лексикографическом смысле среди всех переста-новок множества X. Переход от текущей перестановки к следующей за ней будем осуществлять таким обра-зом:
1) просматривая перестановку справа налево, ищем самую пер-вую позицию i такую, что (если такой позиции нет, значит текущая подстановка и процесс генерации завершается);

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
//------------------Cozdali massiv, vveli ego elementi------------------
clrscr();
randomize();
int *massiv;
int n;
massiv=new int [n];
printf ("Vvedite razmernost' perestanovki\n");
scanf ("%d",&n);
for (int q=0;q<n;q++)
{
massiv[q]=random(2000);
}
//--------------------------------Proverka na yniversal'nost'---------------------------------
for (int r=0;r<n;r++)
{ for (int t=r+1;t<n;t++)
{ if (massiv[r]==massiv[t])
{
massiv[t]=0;
}
}
}
//--------------------------------Pe4at' massiva---------------------------------------------
printf ("Elementi perestanovki:\n");
for (int j=0;j<n;j++)
{
printf ("%5d ", massiv[j]);
}
int i,m,temp=0,max=32767;
printf("\n");
//---------------------Generaciya perestanovok v leksikografi4eskom poryadke-----------------
for(; ;)
{
for(i=n-1;i>0;i--)
{
if (massiv<massiv[i+1])
{
for(int z=0;z<n;z++)
{
printf(" %4d ",massiv[z]);
}
printf("\n");

}

for (m=i;m<n;m++)
{
if(massiv<massiv[m])
{
if((massiv[m]<max)&&(massiv[m]>temp))
{
temp=massiv[m];
massiv[m]=massiv;
massiv=temp;
max=massiv[m];
}
}
printf("\n");
//---------------------Pe4at' massiva pri formatirovanii---------------------
for(int z=0;z<n;z++)
{
printf(" %4d ",massiv[z]);
}
printf("\n");

}}

//-------------Pe4at' kone4nogo massiva-----------
printf("Perestanovka: \n");
for (int p=0;p<n;p++)
{
printf("%5d ",massiv[p]);
}
break;

}
delete massiv;
getch();
}
2) просматривая от слева направо, ищем наименьший из элементов такой, что ;
3) меняем местами элементы и ; затем все элементы записываем в обратном порядке (т.е. меняем местами симметрично расположенные элементы и ).
Ответить