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

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

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

Примеры:

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

Ответ: 10

пример решения для:

не загружается

type arrSTR= array[1..20] of string;
     arrINT= array[1..20] of integer;
Var f1:text;
a,b: arrSTR;
IT: arrINT;
filename, s: string;
n: integer;
//функция ищет длину 1й строки как базовую для сравнения, далее считывает адрес
//соединения последующих строк и длину этих строк+длина первой строки от
//начала(корня) до места соединения и сравнивает с длиной начальной.
function search2(b: arrSTR; IT: arrINT): integer;
var i, h, len, len2, Chislo, Code: integer; st: string;
begin
  len:=0;
  len2:=0;
  for i:=1 to high(IT) do
    if IT[i]<>0 then
      inc(len); //нашли длину 1й строки (корневой)
  for i:=1 to high(b) do
    begin
    for h:=1 to length(b[i]) do
      begin
        if (b[i][h]>='0')and(b[i][h]<='9') then
          st:=st+b[i][h]
        else if b[i][h] = '*' then
          inc(len2);
      end;
    Val(st, Chislo, Code);//адрес в корневой строке
    st:='';
    if Chislo<>0 then
      begin
        for h:=1 to high(IT) do
          if IT[h]=Chislo then
            len2:=len2+h;
          if len2 > len then
            len:=len2;
          len2:=0;
      end;
    end;
  result:=len;
end;
//процедура преобразует читаемый файл в 2массива: 1ю строку файла в массив INT
//при этом элемент массива = адресу(порядковому номеру) числа(точки/узла) в строке
//текстового файла, последующие строки преобразует в массив string, первый элемент 
//которых всегда записывается адрес "соединения" с  первой строкой далее символом
//"*" пишет количество цифр в строке
//пример:    [1,8,25,38,42]
            [25,*,*,*,*]
procedure search(var a,stroki: arrSTR; var IT: arrINT);
var i, t, n, c: integer; st2,g: string;
begin
  n:=1;
  c:=1;
  for i:=1 to high(a) do //перебор строк
    begin
      for t:=1 to length(a[i]) do  //перебор символов строки
        begin
           if (a[i][t]>='0')and(a[i][t]<='9') then //если встретили числ
             begin
             if i=1 then
               begin
                 IT[c]:=t;
                 inc(c);
               end
             else
               st2:=st2+'*';
             end;
           if (a[i][t]='|') AND (a[i][t+1]='-') then
             begin
               str(t,g);
               st2:=st2+g;
             end;
        end;
      stroki[n]:=st2;
      st2:='';
      inc(n);
    end;
end;
begin
  filename := 'C:\cepochki.txt';
  assign(f1, filename);
  reset(f1);
  n:=1;
  writeln('========nachalo faila=====');
  while not eof(f1) do
    begin
      readln(f1, s);
      writeln(s);
      a[n]:=s;
      n:=n+1;
    end;
  writeLn('========= konez faila =========');
  search(a,b,IT);
  writeln('END len= ',search2(b,IT));
  readln();
end.
vedro-compota's picture

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

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