Задача 4 урок 18
Primary tabs
Задача 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.
- Log in to post comments
- 916 reads
vedro-compota
Sun, 09/19/2021 - 12:18
Permalink
решение засчитано
решение засчитано
_____________
матфак вгу и остальная классика =)