Surround
Цитата:
по какому принципу заполняется массив b с символами?
|
Лично мне вспомнили старые кассовые аппараты (или что-то типа того). Ну короче. Представь бесконечно длинный стержень. На нём
jm колец, на каждом из которых высечено
js символов. Изначально на всех кольцах стоит первый символ. И дальше они слева направо начинают крутиться
![Smile](images/smilies/new/smile.gif)
. Дальше объяснения перейдут непосредственно к коду, иначе не понять всех тонкостей
![Smile](images/smilies/new/smile.gif)
.
Код:
![Выделить весь код](images/misc/selectcode.png)
procedure moving(k,j: Integer);
{ рекурсивная функция, сдвигает символ в k-той позиции, начиная с j-ного }
var
i: Integer; { "счетчик" цикла }
begin
for i:=j to js do begin { т.к. придется прокрутить ВСЕ символы, ставим цикл}
b[k]:=a[i]; { прокручиваем на 1 символ вперед в текущей k-той позиции }
if passed then { проверяем получившуюся строку b на соответствие условию }
if res.IndexOf(b)=-1 then res.Add(b); { добавляем в общий список, если такого там еще нет }
{ Здесь я обязан сделать отступление и прокомментировать предыдущую строчку:
не знаю по каким причинам, но примерно 10% результатов повторяются =) , кто найдет
место "облома", тому огромная благодарность }
if k > 1 then moving(k-1,1); { если есть еще кольца слева, то крутим и их }
{ Заметьте, что здесь j=1, а при вызове из главной программы j=2,
это введено для уменьшения цикла, т.к. изначально на всех кольцах
установлен первый символ из списка, т.е. b[k] уже равно a[1] }
end;
end;
Ну хоть немножко я прояснил ситуацию?
![Smile](images/smilies/new/smile.gif)