ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 29
- 30
- 31
- 32
- 33
- …
- следующая ›
- последняя »