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

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

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

type AR = array[1..10, 1..100] of string;
var arS :AR;
    f1 :text; // тип для открытия текстового файла
    filename, s :string;
    count, i, max, itr_g, itr_v, max2 :integer;

function make_array(s :string; count :integer) :AR;
var i :integer;
begin
  for i := 1 to length(s) do
    arS[count, i] := s[i];
  make_array := arS;
end;

function make_int(var max :integer; itr_g, itr_v :integer; arS :AR) :integer;
var i, res :integer;
begin
  res := 0;
  for i := 1 to itr_v + 1 do
    if (arS[1, i] >= '0') and (arS[1, i] <= '9') then
      res += 1;
  res := res + itr_g;
  if max < res then
    max := res;
  make_int := max;
end;

procedure make_array_int(arS :AR);
var i, j, itr_v, itr_g, len :integer;
begin
  for i := high(arS) downto low(arS) do
  begin
    itr_g := 0; // сколько чисел по горизонту
    itr_v := 0; // узел на первой строке
    len := length(arS[i]);
    for j := high(arS[i]) downto low(arS[i]) do
    begin
      len -= 1;
      if (arS[i, j] >= '0') and (arS[i, j] <= '9') then
        itr_g += 1
      else
        if arS[i, j] = '|' then
        begin
          itr_v := len;
          make_int(max, itr_g, itr_v, arS);
        end;
    end;
  end;
end;

begin
  count := 1;
  filename := 'C:\Pascal\U_0\input.txt'; // путь к файлу
  assign(f1, filename);
  {$I-} reset(f1);  {$I+}  // попытка открыть файл на чтение с подавлением ошибки
  if IOResult <> 0 then    // если есть ошибки
  begin
    writeLn('File ', filename, ' ne naiden!');
  end else  // если удалось открыть на чтение
  begin
    writeLn('File ', filename, ' suchectvuet. I vot ego soderzimoe:');
    while not eof(f1) do
    begin
      readln(f1, s);
      make_array(s, count);
      count += 1;
    end;
  end;
  make_array_int(arS); //
  make_int(max, itr_g, itr_v, arS);
  for i := 1 to length(arS[1]) do
  begin
    if (arS[1, i] >= '0') and (arS[1, i] <= '9') then
      max2 += 1;
  end;
  if max > max2 then
    write(max)
  else
    write(max2);
  readln();
end.  
vedro-compota's picture

засчитано

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