Олимпиадные задачи по программированию. Ч. 3. Лучшие решения. Ускова О.Ф - 31 стр.

UptoLike

Составители: 

31
Следующий вызов рекурсивной функции решает задачу
подсчета числа снимаемых бусинок для точки разрыва,
отвечающей числу k:
Число _ бусинок:=
Number(k+N,-1,w)+Number(k+N+1,+1,w);
где функция Number устроена так :
function Number (j,move:integer; c:char):integer;
begin
if (j>i-N) and (j<i+N) and ((c='w') or (A[j]='w') or (A[j]=c))
then
if c='w' then
Number:=1+Number(j+move,move,A[j])
else Number:=1+Number(j+move,move,c)
else Number:=0;
end;
В случае «вырожденнных» бус Число _ бусинок
получиться равным 2*N-1, и этот случай следует рассмотреть
отдельно. Заметим, что условие ((c='w') or (A[j]='w') or (A[j]=c))
можно заменить на более лаконичное (А[j], c] <>[b,r]).
В основной программе нам осталось лишь найти
максимальное число снимаемых бусинок при различных
значениях i. Этот алгоритм и реализован в программе,
приведенной в приложении.
program bysi;
const NMax=100;
var A:array[1..3*NMax] of char;
i,N:integer;
procedure ReadData;
var s:string;
begin