Цитата(-Человек- @ 16.10.2006 17:54)
Как я понял, код ищет)) 1 прямоугольник
Нет. Код ищет все прямоугольники всех видов.
Как известно, каждый символ имеет свой ASCII-код, число от 0 до 255 (если, конечно, текст записан в ASCII кодировке
). К примеру, решетка (#), если не ошибаюсь, 35.
Вложенным циклом я пробегаю по всем клеткам массива:
Цитата
Код
for i := 1 to height do
for j := 1 to width do
Затем я смотрю, что эта клетка - не пустая:
Цитата
Код
if s[i, j] <> '.' then
Затем я проверяю, что клетка принадлежит верхней границе своего прямоугольника. Для этого смотрю, что сверху над этой клеткой либо кончается поле (i = 1), либо находится клетка с другим символом:
Цитата
Код
if (i = 1) or (s[i - 1, j] <> s[i, j]) then //сверху нету такого же
Затем - аналогичная проверка слева:
Цитата
Код
if (j = 1) or (s[i, j - 1] <> s[i, j]) then //слева нету такого же
Если все условия выполнились, это означает, что мы нашли левую верхнюю клетку некоторого прямоугольника (если, конечно, случаи из постов 2 и 3 исключены).
Чтобы учесть этот факт, возьмем ASCII-код символа в текущей клетке:
Цитата
В начале заведем массив из 256 счетчиков:
Цитата
Код
var count: array[0 .. 255] of longint;
...
begin
...
fillchar(count, sizeof(count), 0);
Найдя прямоугольник, состоящий, например, из решеток, увеличим счетчик с индексом 35. В общем случае:
Цитата
Код
Inc(count[ord(s[i, j])]);
В каждом прямоугольнике ровно одна клетка является левой верхней, поэтому мы посчитаем каждый прямоугольник один и ровно один раз.
Чтобы вывести статистику, ищем счетчики с ненулевыми показателями:
Код
for i := 0 to 255 do
if count[i] > 0 then
Writeln('Found ', count[i], ' rectangles built with symbol ', Chr(i));