Задача 20 Урок 15

Задача 20 Урок 15

Дан массив длиной N (не более 100 элементов), состоящий из случайно выбранных чисел из диапазона от 00 до k, где 0≤k Найдите в этом массиве длину самого короткого фрагмента, который содержит все числа от от 0 до k.

type
  myArr = array [1..100] of integer;
  //myArr = array [1..10] of integer;

var
  min, max: integer;
  a: myArr;
  i,i2, j: integer;     // счётчики
  p,m,k:integer;
  c:boolean;      // для цикла поиска  если сегмент  будет найден
  v:integer;      // заводим переменную v если сегмент не будет найден


function searchoneM(a: myArr): integer;
var b:boolean;
begin

  b:=false;
  for i := low(a) to high(a) do
    if b=false then
      begin
        if a[i]=0 then
        begin
          m:=i;
          b:=true;
        end;
      end
    else  break;
end;

function searchoneP(m,k:integer; a: myArr): integer;
var b:boolean;
begin

  b:=false;
  for i := m to high(a) do
    if b=false then
      begin
        if a[i]=k then
        begin
          p:=i;
          b:=true;
        end;
      end
    else  break;
end;

function searchNum(m,p,k: integer; a: myArr): boolean;

  begin
    for i := 0 to k do
    begin
      result := false;
      for j := m to p do
        if i = a[j] then
        begin
          result := true;
          break;
        end;
      if result = false then
        break;
    end;
  end;

function searchNextM(a: myArr; p: integer): integer;
var b:boolean;
begin
  b:=false;
  for i := p to high(a) do
    if b=false then
      begin
        if a[i]=0 then
        begin
          m:=i;
          b:=true;
        end;
      end
    else  break;
end;

function searcNextP(m,k:integer; a: myArr): integer;
var b:boolean;
begin

  b:=false;
  for i := m to high(a) do
    if b=false then
      begin
        if a[i]=k then
        begin
          p:=i;
          b:=true;
        end;
      end
    else  break;
end;



begin
  c:=false;
  randomize();
  //a[1]:=3;
  //a[2]:=3;
  //a[3]:=3;
  //a[4]:=3;
  //a[5]:=3;
  //a[6]:=0;
  //a[7]:=1;
  //a[8]:=2;
  //a[9]:=3;
  //a[10]:=4;
  min := 0;
  max := 10;
  for i := low(a) to high(a) do
    a[i] := min + random(max - min + 1);
  writeln('enter k');
  readln(k);
  m:=searchoneM(a);                       // ищем первое m
  p:=searchoneP(m,k,a);                   // ищем первое p
  repeat
    if (searchNum(m,p,k, a)) then       // передаём и возвращаем функцию
      begin
        c:=true;
        writeln('Everything is on the segment',' ','from',' ', m,' ', 'to',' ',p);
        for i := m to p do
          write(a[i], ' ');
        writeln();
        writeln('original');
        for i := low(a) to high(a) do
          write(a[i], ' ');
      end
    else
      m:=searchNextM(a,p);      // если в первом случае не найдено и т.д.
      p:=searcNextP(m,k,a);     // если в первом случае не найдено и т.д.
      v+=1;
    if  v=100 then
      begin
      writeln();
      writeln('the segment was not found');
      writeln();
      writeln('original');
        for i := low(a) to high(a) do
          write(a[i], ' ');
      end;
  until (c=true) or (v=100);
  writeln();
  write('End');
  readln();
end.   

Вывод консоли:

enter k
3
Everything is on the segment from 49 to 70
0 2 1 4 7 5 1 9 6 1 1 10 8 2 1 2 8 4 5 7 0 3
original
8 4 2 10 5 2 3 7 4 2 4 3 0 3 5 4 8 7 9 6 8 10 5 3 0 4 3 4 6 4 8 3 6 6 4 6 3 9 4 7 1 6 1 7 3 10 4 2 0 2 1 4 7 5 1 9 6 1 1 10 8 2 1 2 8 4 5 7 0 3 10 5 10 9 0 1 4 9 3 8 3 2 0 9 6 4 10 10 10 0 4 7 8 0 3 6 1 9 10 9
End