Задача 4 Урок 19
Primary tabs
Дан текстовый файл, в котором с в 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
- Log in to post comments
- 258 reads