![]() |
Всего один цикл
Вот алгоритм, который мне нужно реализовать.
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(); } |
Balbec, а задачу в словах можно написать? Что нужно, содержание самой задачи какое? Код очень нечитабельный, на будущее, используйте тег [code]
|
Нужно вывести перестановоки в лексикографическом порядке, т.е. если у множества 4 элемента, то вывести надо 16 строк
1234 2341 3412 .... и так далее |
Цитата:
Теперь по коду. Демонстрирую как работает закоментированный кусок, если 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> |
Спасибо большое! Учту замечания :)
|
Время: 14:11. |
Время: 14:11.
© OSzone.net 2001-