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

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

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

> задача про фотографию, двумерный массив является цветной фотографией
oleg
сообщение 3.01.2006 15:39
Сообщение #1


Гость






Двумерный массив является "цветной фотографией", каж-
дый его элемент - номер цвета некоторой точки (от 1 до некото-
рого значения Max).
Будем считать, что если два элемента стоят рядом по
вертикали или по горизонтали и имеют одинаковый цвет, то они
принадлежат одной области. (Вся область определяется рефлек-
сивно-транзитивным замыканием этого отношения.)
Требуется найти количество разных цветных областей.
Запрещается пользоваться метками!

P.S до зачета три дня

Сообщение отредактировано: oleg - 3.01.2006 15:51
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 8)
virt
сообщение 3.01.2006 18:59
Сообщение #2


Знаток
****

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

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


Код
program num_obl;
const maxN = 10;
var a : array[0..maxN + 1,0..maxN + 1]of byte;
    i,j,n : integer;
    cou : integer = 0;
    col : byte;

procedure flood(ii,jj : integer);
begin
   if a[ii,jj] <> col then exit;
   a[ii,jj] := 0;
   flood(ii - 1,jj);
   flood(ii + 1,jj);
   flood(ii,jj - 1);
   flood(ii,jj + 1);
end;

begin
   readln(n);
   fillchar(a,sizeof(a),0);
   for i := 1 to n do
      for j := 1 to n do
         read(a[i,j]);
   for i := 1 to n do
      for j := 1 to n do
         if a[i,j] <> 0 then
            begin
               cou := cou + 1;
               col := a[i,j];
               flood(i,j);
            end;
   writeln(cou);
end.


вот ,вроде так


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
oleg
сообщение 4.01.2006 10:59
Сообщение #3


Гость






!priva1.gif мне кажется, что тоже. Большое спасибо!

Сообщение отредактировано: oleg - 4.01.2006 11:19
 К началу страницы 
+ Ответить 
volvo
сообщение 4.01.2006 11:20
Сообщение #4


Гость






Вот так попробуй (проверка выхода за пределы массива никогда не была лишней !!!):
program num_obl;
const maxN = 5;
type
arr = array[1..maxN, 1..maxN] of integer;
const
a: arr =
(
(1, 0, 0, 0, 1),
(0, 1, 1, 1, 0),
(0, 1, 0, 1, 0),
(0, 1, 0, 1, 0),
(1, 0, 0, 0, 1)
);
var
i,j,n : integer;
cou : integer = 0;
col : byte;

procedure flood(ii,jj : integer);
begin
if (a[ii,jj] <> col)
or
(ii < 1) or (jj < 1) or (ii > n) or (jj > n)
then exit;
a[ii,jj] := -1;
flood(ii - 1,jj);
flood(ii + 1,jj);
flood(ii,jj - 1);
flood(ii,jj + 1);
end;

begin
n := maxN;
for i := 1 to n do
for j := 1 to n do
if a[i,j] <> -1 then begin
cou := cou + 1;
col := a[i,j];
flood(i,j);
end;
writeln(cou);
end.
 К началу страницы 
+ Ответить 
Гость
сообщение 4.01.2006 23:23
Сообщение #5


Гость






Мужики а почему
writeln(cou)
а не writeln(cou-1)
 К началу страницы 
+ Ответить 
volvo
сообщение 4.01.2006 23:37
Сообщение #6


Гость






А почему Cou-1? Здесь же нет фона, если будет только один цвет - это значит не 0, а 1 область...
 К началу страницы 
+ Ответить 
Гость
сообщение 4.01.2006 23:51
Сообщение #7


Гость






А ты результат посмотри выполнения
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2006 0:14
Сообщение #8


Гость






А ты думаешь, я свой вариант программы выложил, не проверив ВСЕ тесты автора? То, что он сказал, то и получил. А ты что, его адвокат? Какое отношение ТЫ к вопросу имеешь? Ты еще за автора будешь решать, что ему подойдет, а что - нет?

Кстати, при прогоне программы из поста №4 на матрице
const
a: arr =
(
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0),
(0, 0, 0, 0, 0)
);

Выдается результат:
Цитата
Running "f:\vlady documents\programs\pas\__4554.exe /sum 20.5 63.2"
1
Что я делаю неправильно?

А ты прогонял, чтобы претензии высказывать? И потом, ты считаешь, что результат неправильный, чего же ты НИ РАЗУ ни одно правильное решение не запостил? Кстати, ты ВООБЩЕ никакое не постишь... Нехорошо.
 К началу страницы 
+ Ответить 
virt
сообщение 5.01.2006 19:25
Сообщение #9


Знаток
****

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

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


Цитата
var a : array[0..maxN + 1,0..maxN + 1]of byte;


там проверка на выход за переделы есть


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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