Задача 4 Урок 18

Задача 4 Урок 18

Дан текстовый файл, в котором с в ASCII-стиле нарисованы цепочки из цифр, которые связаны по горизонтали и вертикали.
Все цепочки составляют одно дерево, которое устроено так:
всегда есть общий корень и это цифра
по горизонтали цепочка не разрывается пробелами, соединяется же с помощью последовательностей знака - (тире).
по вертикали цепочка не разрывается переносом строк, соединяется же с помощью вертикальных последовательностей символа | (вертикального разделителя).
Размер схемы не более чем 100 на 100 символов.

Примеры:

1------4--------------5-------6--------7
       |              |
       |              |-------5---------8
       |
       |-------6--------7--7-------9------8---1----5---3

Ответ: 10

1------4------8--------5-------6--------7
       |      |        |
       |      |        |-------5---------8
       |      |                
       |      |--------8-8-8---8----8
       |     
       |-------6--------7--7
       |--------------5-5--5--5 

Ответ: 8

var i,m,z, k, max, countNum : integer;
    s,f,firstStr : string;
    f1:text;
    filename: string;
//f  - три состояния флага(уменьшает кол-во лишних итераций)
//firstStr - певая строка(ствол)
//z  - ограничитель счетчика цикла для ствола и старт для веток


procedure getMaxNummHorisontal(s: string; var max: integer; firstStr: string); //   поиск max
begin
  countNum := 0;
  for i := 1 to length(s) do
    begin
      if((s[i] = '|') and (s[i+1] = '-')) then
        begin
          f := 'sVetkoy';
          z := i; // ограничитель счета по стволу
        end
      else if(s[1] = '1') then
        begin
          f := 'bezVetok';
          z := length(s); // ограничитель счета по стволу
        end
      else
        f := 'pysto';

      if(f <> 'pysto') then // если сначала не пусто то посчитать длину ствола
        for m := 1 to z do  // подсчет по стволу с заданым ограничением z
            if((firstStr[m] >= '0') and (firstStr[m] <= '9')) then
              countNum := countNum + 1;


      if(f = 'sVetkoy') then    // если нужно посчитать длину веток
        for m := z to length(s) do
          if((s[m] >= '0') and (s[m] <= '9')) then
            countNum := countNum + 1;

      if(countNum > max) then    //  поиск максимума перезаписью
        begin
          max := countNum;
          break;
        end
      else if(f = 'sVetkoy') then //выйти после того как цикл пробежал по ветке
        break;
    end;
end;

begin
  k:=0;
  filename := 'C:\Users\Gomynkyl\AppData\Local\Temp\input.txt';
  assign(f1, filename);
  reset(f1);

  while not eof(f1) do
    begin
      readln(f1, s);
      if(k = 0) then
        firstStr := s; // сохраним первую строку(ствол для дальнейших расчетов)
      getMaxNummHorisontal(s,max,firstStr);
      k:=k+1;
    end;

  writeln(max);
  readln();
end.             
vedro-compota's picture

решение засчитано

_____________
матфак вгу и остальная классика =)