IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> анализ и сравнение, элементов матрицы
Злой человек
сообщение 14.10.2006 16:24
Сообщение #1


Гость






Дана матрица char[n][m]
Надо подсчитать количество прямоугольников(состоящих из различных символов) разных типов (‘.’ не учитывается)
Пример
###. . .??..+.
###.= .??..+.
###. .. . ...+.
. . . . ???.... .
???...... ===
???. . .####..

# прямоугольников 2
? прямоугольников 3
+ прямоугольников 1
= прямоугольников 2

Подскажите, пожалуйста, хотя бы алгоритм... (как вывести матрицу я, конечно, знаю)
Спасибо
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Человек, нуждающийся в помощи
сообщение 15.10.2006 19:44
Сообщение #2


Гость






Я думаю, т.к. матрица задается из файла, то такой заморочки не будет)))
Матрица будет примерно как в примере(простите за тафталогию)...

Спасибо
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 16.10.2006 0:22
Сообщение #3


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Если матрица - примерно как в примере, то всё очень просто.

Считать нужно по левым верхним квадратикам. У каждого прямоугольника есть только один левый верхний квадратик smile.gif, и отличается он от абсолютно всех остальных тем, что над ним, и слева от него символы - другие.

Фрагмент кода будет выглядеть примерно так:

...
var count: array[0 .. 255] of longint;
...
begin
...
fillchar(count, sizeof(count), 0);
for i := 1 to height do
for j := 1 to width do
if s[i, j] <> '.' then
if (i = 1) or (s[i - 1, j] <> s[i, j]) then //сверху нету такого же
if (j = 1) or (s[i, j - 1] <> s[i, j]) then //слева нету такого же
//увеличиваем количество найденных прямоугольников,
//составленных из символов с кодом ord(s[i, j])
Inc(count[ord(s[i, j])]);
...
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.10.2006 11:20
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(Michael_Rybak @ 16.10.2006 1:22) *

Считать нужно по левым верхним квадратикам.

Тогда в примере из поста №2 будет только 1 прямоугольник, что неверно. Нужно после обнаружения прямоугольника закрашивать его неиспользуемым символом ( '.' ), тогда все ок будет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 16.10.2006 13:10
Сообщение #5


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


А что тогда делать с примером из поста 3?

И в посте 2, и в посте 3 прямоугольники пересекаются. Для такой ситуации нужно более четко сформулировать понятие прямоугольников, которые нас интересуют.

ОП говорит, что "такой заморочки не будет".

Сообщение отредактировано: Michael_Rybak - 16.10.2006 13:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.10.2006 15:16
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(Michael_Rybak @ 16.10.2006 14:10) *

А что тогда делать с примером из поста 3?
И в посте 2, и в посте 3 прямоугольники пересекаются. Для такой ситуации нужно более четко сформулировать понятие прямоугольников, которые нас интересуют.

Почему пересекаются, прикасаются только:
#####
#####
#####

### . .
### . .
### . .

В четвертом посте не так красиво по моему алго получится, что-то типа этого:


...1...
..213..
.42135.
6421357
.42135.
..213..
...1...

Аж 7 штук smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Злой человек   анализ и сравнение   14.10.2006 16:24
-Человек-   ##### ##### ##### ### . . ### . . ### . . Для так...   14.10.2006 17:48
Michael_Rybak   Хм, а для такой, получается, 4? ...#... ..###.. ....   14.10.2006 19:21
Человек, нуждающийся в помощи   Я думаю, т.к. матрица задается из файла, то такой ...   15.10.2006 19:44
Michael_Rybak   Если матрица - примерно как в примере, то всё очен...   16.10.2006 0:22
Malice   Считать нужно по левым верхним квадратикам. Тогда...   16.10.2006 11:20
Michael_Rybak   А что тогда делать с примером из поста 3? И в пос...   16.10.2006 13:10
Malice   А что тогда делать с примером из поста 3? И в пос...   16.10.2006 15:16
-Человек-   Как я понял, код ищет)) 1 прямоугольник, а как пер...   16.10.2006 17:54
Michael_Rybak   Как я понял, код ищет)) 1 прямоугольник Нет. К...   16.10.2006 20:31
Благодарный человек))   Спасибо за исчерпывающий ответ!!! Но я...   17.10.2006 18:04
klem4   Это какие например ? :blink:   17.10.2006 18:06
-Человек-   ВСЕМ СПАСИБО ОГРОМНОЕ!!!!!...   22.10.2006 20:11
volvo   Чтобы не делать так: For i := 0 to 255 do count[i]...   22.10.2006 20:35


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 18:03
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"