Консультация № 64420
27.11.2006, 13:52
0.00 руб.
0 4 1
Вводиться рядок з n символів, 2<n<8. Потрібно знайти скільки можна зробити перестановок
з цього рядка і вивести ці перестановки, їх потрібно виводити по черзі.
Приклад:
Вхідні дані:
IOX
Вихідні дані:
6
XOI
OIX
IXO
XIO
OXI
IOX

Обсуждение

Неизвестный
27.11.2006, 14:54
общий
Сколько - рассчитывается через к число перестановок, нужно только посчитать, сколько различных символовЕсли все различные, то можно так:1) цикл по всем символам;- выводим первой "этот" символ;- 2) вложенный по всем символам;---- выводим символ, если не равен "тому" (сравниваем индексы, конечно);---- 3) вложенный цикл по всем символам--------выводим символ, если не равен ни одному из первых;и т.д., и т.п.Справишься с реализацией? По-моему, не трудно
Неизвестный
27.11.2006, 14:57
общий
По Вашему условиюМожно написать 7 таких вложенных циклова затем прерывать перед следующим (с помощью break), если букв меньше 8
Неизвестный
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;}
Неизвестный
27.11.2006, 16:54
общий
Сухомлин Кирилл Владимирович помогите пожалуйста перевести на Паскаль!
Форма ответа