Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.05;
Скачать: CL | DM;

Вниз

Прямоугольники   Найти похожие ветки 

 
Николай Быков ©   (2002-11-13 16:58) [0]

Условие:
На квадратном клечатом листе бумаги размером 100х100 клеток нарисовано несколько прямоугольников. Каждый прямоугольник состоит из целых клеток, различные прямоугольники не накладываются друг на друга и не соприкасаются.
Написать программу, которая считает число этих прямоугольников.

Техническое условие:
Ограничение по времени тестирования: по 1 секунде на один тест.

Формат входных данных:
Входной файл INPUT.TXT содержит массив 100х100, в котором элемент A[i,j]=1, если клетка [i,j] принадлежит какому-либо прямоугольнику, и A[i,j]=0, в противном случае.

Формат выходных данных:
В файл OUTPUT.TXT необходимо вывести единственное число - количество прямоугольников.


 
RV ©   (2002-11-13 17:15) [1]

Техническое условие:
Ограничение по времени тестирования: по 1 секунде на один тест.

??????


 
RV ©   (2002-11-13 17:17) [2]

а вообще-то легко, но

Техническое условие:
Ограничение по времени тестирования: по 1 секунде на один тест.

не понятно


 
Johnny Smith ©   (2002-11-13 17:19) [3]

Очередная задачка с олимпиады?


 
RV ©   (2002-11-13 17:23) [4]

причем похоже не меняются :)

у нас, правда, интереснее было :), но тоже прямоугольники,
и пересекаются/не пересекаются
и поле ограничено известно каким числом/ограничено неизвестно каким числом


 
Феу ©   (2002-11-13 17:24) [5]

Кажется, такое должно считаться намного быстрее 1с на нормальной машине (быстрее 8008 ;-)
Смотрим все по очереди, наткнувшись на прямоугольник считаем его, как-нибудь метим(можно просто стереть), чтоб не мешался, и ищем дальше.
Гм... с такими вопросами к людям... Может таки не здря тебя так тут пинают?
Или я всеж не понял про время и в нем вся заморолчка? Можт 0,00...1?


 
Romkin ©   (2002-11-13 17:29) [6]

Что-то вроде этого тебе катит? Вроде должно работать, правда, писал код прямо в форуме :-))


var
InRect: boolean;
RectCount:array [1..100] of integer;
i,j: integer;
AllRect: integer;
begin
for i := 1 to 100 do RectCount[i] := 0;
InRect := false;
for i := 1 to 100 do
for j := 1 to 100 do
begin
if (A[i,j] = 1) and (not inRect) then
begin
inc(RectCount[i]);
end;
inRect := (A[i,j] = 1);
end;
AllRect := RectCount[1];
for i := 2 to 100 do
if RectCount[i-1] < RectCount[i] then
inc(AllRect, RectCount[i] - RectCount[i-1]);
Result := AllRect;
end;


 
McSimm ©   (2002-11-13 17:32) [7]

>Romkin © (13.11.02 17:29)
Что-то сомневаюсь...
Хотя может я и недопонял.


 
Romkin ©   (2002-11-13 17:36) [8]

О! массив можно и не пользовать :-)), считать в первом цикле, впрочем, это на любителя :-))


 
Romkin ©   (2002-11-13 17:37) [9]

2McSimm: Двойной цикл считает для каждой строки кол-во перемен с 0 на 1 - вход в прямоугольник (левая граница)
второй цикл по RectCount подсчитывает число верхних границ


 
Дремучий ©   (2002-11-13 17:52) [10]

если б соприкасались - было бы интересней...
:)

П.С. елки, уже по инерции хочется съязвить...


 
DAC ©   (2002-11-14 11:35) [11]


> Romkin © (13.11.02 17:29)


Красиво, но неверно! :)
Второй цикл лишён логического смысла.

Контрпример на матрице 3 на 3 :

var
A : array [1..3,1..3] of integer;
InRect: boolean;
RectCount:array [1..3] of integer;
i,j: integer;
AllRect: integer;
begin
A[1,1] := 0;
A[1,2] := 0;
A[1,3] := 1;
A[2,1] := 0;
A[2,2] := 0;
A[2,3] := 1;
A[3,1] := 1;
A[3,2] := 0;
A[3,3] := 0;

for i := 1 to 3 do RectCount[i] := 0;
InRect := false;
for i := 1 to 3 do
for j := 1 to 3 do
begin
if (A[i,j] = 1) and (not inRect) then
begin
inc(RectCount[i]);
end;
inRect := (A[i,j] = 1);
end;
AllRect := RectCount[1];
for i := 2 to 3 do
if RectCount[i-1] < RectCount[i] then
inc(AllRect, RectCount[i] - RectCount[i-1]);
Result := AllRect;
end;


Здесь целых 3 прямоугольника, а Ваш алгоритм выдаст только 1.

Теперь Николашка (если он знает алгоритм) имеет полное моральное право утереть Вам нос! :)


 
Romkin ©   (2002-11-14 11:41) [12]

Там неточность: перед for j надо вставить inRect := false, просто не сбрасывает флаг


 
Romkin ©   (2002-11-14 11:43) [13]

А прямоугольника всего 2 :-))


 
McSimm ©   (2002-11-14 11:46) [14]

>Красиво, но неверно! :)
>Второй цикл лишён логического смысла.
Насчет логического смысла немного сильно сказано.
Небольшая огреха - InRect := false; надо не перед внешним, а перед внутренним циклом. И все.


 
Ru ©   (2002-11-14 11:48) [15]

вообще это задача прослеживания контуров
решается следующим образом: пробегаем по исходному массиву, находим первую ещиницу, заносим ее в массив точек контура, бегаем по маске в поисках следующей точки, когда дорвались до начальной точки контура - инкрементируем количество контуров, для исключения повторений мочим контур.


 
DAC ©   (2002-11-14 11:59) [16]


> Romkin © (14.11.02 11:43)


A[1,1] := 1;
A[1,2] := 0;
A[1,3] := 0;
A[2,1] := 0;
A[2,2] := 0;
A[2,3] := 1;
A[3,1] := 1;
A[3,2] := 0;
A[3,3] := 0;

Теперь 3. :)


> Romkin © (14.11.02 11:41)
McSimm © (14.11.02 11:46)

Не поможет.
Количество левых границ и верхних границ на соседних вертикалях могут совпадать, но это не означает одни и те же прямоугольники.

Успехов в решении школьной задачи! :-)))


 
McSimm ©   (2002-11-14 12:22) [17]

>Ru © (14.11.02 11:48)
>вообще это задача прослеживания контуров
есть вариант проще, подсчитать все (например) левые верхние углы

> DAC © (14.11.02 11:59)

Да уж, припер :)



Страницы: 1 вся ветка

Текущий архив: 2002.12.05;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
8-14693
Groove
2002-08-10 21:12
2002.12.05
MP3


14-14817
OlegS Astana
2002-11-16 09:01
2002.12.05
Работа с градусами


3-14407
Valery_N
2002-11-15 15:39
2002.12.05
Подсчет сумм в подчиненной таблице


3-14415
Step[B.M.]
2002-11-16 01:25
2002.12.05
Firebird... какие плюсы или какие минусы ???


3-14472
skiph
2002-11-14 13:13
2002.12.05
ADOQuery и Группировка в отчете