27.11.2006, 16:02
общий
это ответ
Здравствуйте, Shef!
Взять код для решения <a href=http://acm.mipt.ru/judge/problems.pl?problem=078>следующей</a> задачи и с помощью него итеративно перебрать все варианты.
Идея решения вышеуказанной задачи тоже проста:
перебираем все символы, начиная с конца слова, пока не найдем встретившиеся 2 рядом, но в обратным алфавитном порядке. Типа: zzzyyxxxc<b>cd</b>dddbbaa
Надо учесть, что таких символов может быть несколько подряд:
zzzyyxxxcc<b>ddd<u>d</u></b>bbaa, но взять нам надо будет более близкий к концу.
Остается поменять местами найденные два символа:
zzzyyxxxc<b>d</b>ddd<b>c</b>bbaa
И вывести первую часть строки в прямом, порядке, а вторую - в обратном:
zzzyyxxxcd<u>aabbcddd</u>
В приложении мое решение подзадачи по взятию следующего по алфавиту числа из того же набора букв. На Си, точно верное и работающее. Если не сможете "перевести" на Паскаль, напишите на форум — я переведу.
Приложение:
#include <stdio.h>#include "string.h"int main(){ char s[201]; scanf("%s", s); int l = strlen(s); int i = l - 1; while ((i > 0) && (s[i] <= s[--i]));// printf("i=%d\n", i); if ((i > 0) || (s[0] < s[1])) { int k = l; while ((s[--k] <= s[i]) && (k > i)); // ? // printf("k=%d\n", k); int j; // swap s[i] & s[k] char c; c = s[i]; s[i] = s[k]; s[k] = c; // printf("%s\n", s); for(j=0; j<=i; j++) putchar(s[j]); for(j=l-1; j> i; j--) putchar(s[j]); } else printf("no word"); return 0;}