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

Урок 19

Дан текстовый файл, в котором с в 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

Задача: вывести длина самой длинной цепочки.

 type cArr = array[1..100, 1..100] of char;

function getWinHorizont(charArr: cArr): integer;
//ищем узлы в горизонтали в массиве
  var knots, winKnots, loopCount1, loopCount2, crossCell: integer;

begin
  winKnots := 0;
  for loopCount1 := 1 to 100 do //следующая строка
  begin
    knots := 0;
    crossCell := 0;
    for loopCount2 := 1 to 100 do //след ячейка массива
    begin
      //ищу число
        if (charArr[loopCount1, loopCount2] >= '0') and
        (charArr[loopCount1, loopCount2] <= '9') then //если символ - цифра
        begin
          inc(knots); //счетчик узлов в плюс, когда найдена цифра (узел)
        end
        else if (charArr[loopCount1, loopCount2] = '|') and
        (charArr[loopCount1, loopCount2 + 1] = '-') then //если символ не цифра
        begin
          crossCell := loopCount2;
        end;
    end;

    if crossCell <> 0 then
      for loopCount2 := 1 to crossCell do //след ячейка массива
      begin
        //ищу число
          if (charArr[1, loopCount2] >= '0') and
          (charArr[1, loopCount2] <= '9') then //если символ - цифра
          begin
            inc(knots); //счетчик узлов в плюс, когда найдена цифра (узел)
          end;
      end;
    if knots > winKnots then //если новое число узлов больше прошлого большего
      winKnots := knots;
  end;
  getWinHorizont := winKnots;
end;

procedure sendToArr(s: string; sCount: integer; var charArr: cArr);
//отправляем символы из файла в массив 100 на 100
  var loopCount: integer;

begin
  for loopCount := 1 to length(s) do
  begin
    charArr[sCount, loopCount] := s[loopCount];
  end;
  if length(s) < 100 then
  begin
    for loopCount := length(s) + 1 to 100 do
    begin
      charArr[sCount, loopCount] := ' ';
    end;
  end;
end;

procedure fillArr(sCount: integer; var charArr: cArr);
//заполняем остальные строки массива символов пробелами, чтобы не было случайных символов и чисел
var loopCount1, loopCount2: integer;

begin
    for loopCount1 := sCount + 1 to 100 do //след ячейка массива после счетчика строк
    begin
      for loopCount2 := 1 to 100 do //след ячейка массива
      begin
        charArr[loopCount1, loopCount2] := ' ';
      end;
    end;
end;

procedure fileContent(var f1: text; filename: string; charArr: cArr);
//выводим контент файла и получаем большее число узлов

  var
    s: string;
    sCount: integer;

begin
  sCount := 0;//счетчик строк - чисто для себя
  assign(f1, filename); // ассоциируем переменную f1 с именем файла
  {$I-} reset(f1); {$I+} //проверка на ошибку при открытии файла
  if IOResult <> 0 then
    WriteLn('Файл ', filename, ' не найден!')
  else
  begin
    WriteLn('Файл существует, вот его содержимое:');
    WriteLn();
    WriteLn('===Начало файла===');
    while not eof(f1) do //пока не конец файла
    begin
      readln(f1, s);
      WriteLn(s);
      inc(sCount); // считаю строки чисто для себя
      sendToArr(s, sCount, charArr); //отправляем строку для записи в массив
      if sCount < 100 then
        fillArr(sCount, charArr);
    end;
  end;
  WriteLn('===Конец файла===');
  WriteLn();
 // WriteLn('Число строк в файле ', sCount);
  WriteLn('Длина самой большой цепочки: ', getWinHorizont(charArr));
end;

var f1: text;
    filename: string;
    charArr: cArr;

begin
  filename := 'C:\Pascal\19\input4.txt';
  fileContent(f1, filename, charArr);
  readln();
end.

КОНСОЛЬ

Файл существует, вот его содержимое:

===Начало файла===
1------4------8--------5-------6--------7
       |      |        |
       |      |        |-------5---------8
       |      |
       |      |--------8-8-8---8----8
       |
       |-------6--------7--7
       |--------------5-5--5--5
===Конец файла===

Длина самой большой цепочки: 8