PDA

Показать полную графическую версию : [решено] Всего один цикл


Balbec
15-05-2008, 20:37
Вот алгоритм, который мне нужно реализовать.
1) просматривая перестановку справа налево, ищем самую пер-вую позицию i такую, что (если такой позиции нет, значит текущая подстановка и процесс генерации завершается);
2) просматривая от слева направо, ищем наименьший из элементов такой, что ;
3) меняем местами элементы и ; затем все элементы записываем в обратном порядке (т.е. меняем местами симметрично расположенные элементы и ).
А вот код, который я написал. Ошибка где-то в закомментированном цикле, не пойму где. Помогите-а?
#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]=q+1;
}

//--------------------------------Pe4at' massiva---------------------------------------------
printf ("Elementi perestanovki:\n");
for (int j=0;j<n;j++)
{
printf ("%5d ", massiv[j]);
}
int i,m,max=32767;
int iminus1=0;
int index=0;
int temp=0;
printf("\n");
//---------------------Generaciya perestanovok v leksikografi4eskom poryadke-----------------
for(;;)
{
for(i=n-1;i>0;i--)
{
if (massiv[i]>massiv[i-1]) { iminus1=i-1;}
break;
}

if(i==0) break;

for (m=i;m<n;m++)
{
if((massiv[iminus1]<massiv[m])&&(massiv[m]<max)) { max=massiv[m];}
index=m;
}

temp=massiv[iminus1];
massiv[iminus1]=massiv[index];
massiv[index]=temp;
//Вот цикл в котором ошибка
// for(int b=i;b<n;b++)
// {
// int obmen=massiv[b];
// massiv[b]=massiv[(-1)*(b+1)+n];
// massiv[(-1)*(b+1)+n]=obmen;
// }

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

Drongo
15-05-2008, 21:36
Balbec, а задачу в словах можно написать? Что нужно, содержание самой задачи какое? Код очень нечитабельный, на будущее, используйте тег [code]

Balbec
16-05-2008, 10:40
Нужно вывести перестановоки в лексикографическом порядке, т.е. если у множества 4 элемента, то вывести надо 16 строк
1234
2341
3412
....
и так далее

ivank
16-05-2008, 12:37
Нужно вывести перестановоки в лексикографическом порядке, т.е. если у множества 4 элемента, то вывести надо 16 строк »
24

Теперь по коду. Демонстрирую как работает закоментированный кусок, если i=0 n=4
было: 1 2 3 4
1-й проход: 4 2 3 1
2-1 проход 4 3 2 1
3-й проход: 1 3 2 4
4-й прохож 1 2 3 4
в результате ничего не поменялось :)

Нужно менять только _половину_ элементов с элементами с другой стороны. Это первая ошибка. Вторая заключается в том, что вы индексы неправильно считаете. Третья, в том, что неправильно элементы, которые надо менять местами (неинициализированные max и index, неправильная расстановка фигурных скобочек). Ещё вы память под массив неправильно выделяете, что вам ваш компилятор прощает.

Вот слега исправленный (и работающий) код:#include <stdio.h>
#include <stdlib.h>
int main()
{
//------------------Cozdali massiv, vveli ego elementi------------------
int *massiv;
int n;
printf ("Vvedite razmernost' perestanovki\n");
scanf ("%d",&n);
massiv=new int [n];
for (int q=0;q<n;q++)
{
massiv[q]=q+1;
}

//--------------------------------Pe4at' massiva---------------------------------------------
printf ("Elementi perestanovki:\n");
for (int j=0;j<n;j++)
{
printf ("%5d ", massiv[j]);
}
int i,m,max=32767;
int iminus1=0;
int index=0;
int temp=0;
printf("\n");
//---------------------Generaciya perestanovok v leksikografi4eskom poryadke-----------------
for(;;)
{
for(i=n-1;i>0;i--)
{
if (massiv[i]>massiv[i-1]) { iminus1=i-1; break;}
}

if(i==0) break;

index=i;
max=massiv[i];
for (m=i;m<n;m++)
{
if((massiv[iminus1]<massiv[m])&&(massiv[m]<max)) { max=massiv[m]; index=m;}
}

temp=massiv[iminus1];
massiv[iminus1]=massiv[index];
massiv[index]=temp;

//Вот цикл в котором ошибка
for(int b=i;b<i+(n-i)/2;b++)
{
int obmen=massiv[b];
massiv[b]=massiv[n+i-b-1];
massiv[n+i-b-1]=obmen;
}

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

}
delete[] massiv;
}

Рекомендую вам его отформатировать по человечески.

Balbec
16-05-2008, 15:09
Спасибо большое! Учту замечания :)




© OSzone.net 2001-2012