
14.03.2009, 13:31
|
|
|
|
Подскажите алгоритм
Добрый день. Задача следующая: нужно перебрать все возможные комбинации цифр последовательности (например, 211221) следующим образом:
цифры остаются на своих местах, но различаются комбинации тем,что браться может одна цифра,либо две.
Если непонятно изъясняюсь, вот:
2-11-22-1
21-1-2-21
21-12-2-1
и и т.д.
Заранее благодарен
|
|

14.03.2009, 15:09
|
|
Местный
|
|
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,368
|
|
|
Проще всего сгенерировать такие комбинации рекурсивно.
на каждом уровне рекурсии вставляем тире после первого символа текущего остатка строки, или после второго, и вызываем рекурсивную процедуру для каждого из вариантов остатка строки.
Другой путь:
Пусть в последовательности N символов, тогда между ними N-1 мест для вставки тире.
Пусть N-1 - битовое число - маска тире такая, что единичный бит означает наличие тире, а нулевой - отсутствие (например, все единичные биты - 2-1-1-2-2-1). Всего таких чисел 2^(N-1), однако нам нужны только такие двоичные числа, в которых не более одного нуля подряд.
|
|

14.03.2009, 15:18
|
|
|
большое спасибо 
|
|

14.03.2009, 16:15
|
|
|
MBo, а не могли бы вы написать кусочек кода на паскале,демонстрирующий этот алгоритм (ваш первый сбособ)?  а то у меня проблемы с рекурсией
|
|

14.03.2009, 16:31
|
|
Новичок
|
|
Регистрация: 14.03.2009
Сообщений: 1
|
|
|
MBo,
ПРИВЕТ ДРУГАН, ТЫ УМЕЕШЬ ПОЛЬЗОВАТЬСЯ ПРОГРАММОЙ VISUAL BASIC 6.0 ????????
|
|

14.03.2009, 16:44
|
|
Местный
|
|
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,368
|
|
|
Код:
|
var
s: string;
procedure InsertIt(tail: string; Place: Integer);
begin
if Place < 1 then
Memo1.Lines.Add(tail)
else begin
InsertIt(s[Place] + '-' + tail, Place - 1);
if Place > 1 then
InsertIt(s[Place - 1] + '-' + s[Place] + tail, Place - 2)
else
InsertIt(s[Place] + tail, Place - 2)
end;
end;
begin
s := 'ABCDE';
InsertIt(s[Length(s)], Length(s) - 1);
вывод:
A-B-C-D-E
AB-C-D-E
A-BC-D-E
A-B-CD-E
AB-CD-E
A-B-C-DE
AB-C-DE
A-BC-DE |
|
|

14.03.2009, 16:46
|
|
Местный
|
|
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,368
|
|
>УМЕЕШЬ ПОЛЬЗОВАТЬСЯ ПРОГРАММОЙ VISUAL BASIC

нет, VB не знаю
|
|

14.03.2009, 17:17
|
|
|
MBo, премного благодарен  Все работает отлично)
|
|

18.03.2009, 09:30
|
|
|
|
MBo, а можете более подробно объяснить логику приведенного кода. мне подобное необходимо сделать, но что то я не очень разобрался в коде(( заранее спасибо.
|
|

18.03.2009, 09:40
|
|
Местный
|
|
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,368
|
|
|
При первом вызове передается хвост - последний символ строки, и место для вставки тире - перед ним
В рекурсивной процедуре тире вставляется на указанное место, и на одно место левее, получается ветвление на строку с одиночным символом, и с двумя вместе.
Можно прогнать код в отладчике, следя за переменными.
|
|
| Опции темы |
Поиск в этой теме |
|
|
|
| Опции просмотра |
Линейный вид
|
|
| |