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

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

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

> подсчитать кусты роз, незнаю с чего начать
maksimla
сообщение 15.02.2009 13:02
Сообщение #1


Знаток
****

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

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


задача
Старик дед растит в саду розу. Старик забыл подвязать розы и коекакие кусты роз погибли и их пришлось выкопать некоторые розы. Выкопав эти розы сечас может на некоторые маленке кустики разбиты розы, любого размера и разной формы .

напишите а)идею решения задачи
б) написать программу сколько теперь маленких кустов.

Первичные данные записаны в файле duom.txt. На первой строчке написаны два натуральных числа отделенные пробелом числа n m (1<=n<=m<=100) На остальных n строчках написано m чисел неотделанных пробелом 0 или 1:0 показывает что в этом месте роз нету , 1 - есть.

результат записываем в файл rez.txt
первичные данные и результат пример
данные
3 12
110110110111
100010010111
111011010011
результат
4
обьяснение
11 11 11 111
1 1 1 111
111 11 1 11

видно что есть 4 куста роз

вместе с этой программой напишите генератор случайных чисел для этой программы

я так незнаю с чего начать и что делать чтобы программу эту выполнил только думаю сперва все в двойной массив записать а как дальше незнаю помогите


вот написал генератор но неправильно записывает цифры в файл почему? исправьте пожалуйста
program Bevarde1;
var v: array [1..100,1..100] of byte;
i,j,n,m:integer;
t:text;
begin
assign (t, 'duom.TXT');
rewrite (t);
randomize;
n:= random(10)+1;
m:= random(10)+1;
writeln(t,n,' ',m);
for i:=1 to n do
for j:=1 to m do
v[j,i]:=random(2);

for i:=1 to n do
begin
writeln ;
for j:=1 to m do
write(t,v[j,i]);
writeln
end;
close(t);
end.


Сообщение отредактировано: Lapp - 15.02.2009 16:54


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Lapp
сообщение 15.02.2009 16:47
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

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


Вот так надо делать файл:
program Bevarde1;
var
v: array [1..100,1..100] of byte;
i,j,n,m: integer;
t: text;

begin
assign (t, 'duom.TXT');
rewrite (t);
randomize;
m:= random(10)+1;
n:= random(m)+1; { так как n<=m }
writeln(t,n,' ',m);
for i:=1 to n do begin
for j:=1 to m do Write(t,random(2));
WriteLn(t);
end;
close(t);
end.
Тебе тут не нужно было заполнять массив, можно сразу писать в файл.

Теперь по задаче. Как я понял, тебе надо подсчитать количество связных областей единиц. По этому поводу один вопрос: диагональ не считается связью? То есть вот такая конфигурация:
1100
1100
0011
0011
- это две области или одна? Но это не принципиально, зависит только как обходить окрестность.

Если размеры сада не слишком велики, то можно использовать рекурсию. Примерно вот так:
const
l=100;

var
a,b: array[1..l,1..l]of integer;
i,j,m,n,k: integer;
f: text;
c: char;

procedure Mark(i,j: integer);
begin
a[i,j]:=k;
if (i>1)and(a[i-1,j]=-1) then Mark(i-1,j);
if (i<n)and(a[i+1,j]=-1) then Mark(i+1,j);
if (j>1)and(a[i,j-1]=-1) then Mark(i,j-1);
if (j<m)and(a[i,j+1]=-1) then Mark(i,j+1)
end;

begin
Assign(f,'duom.txt');
ReSet(f);
ReadLn(f,n,m);
for i:=1 to n do begin
for j:=1 to m do begin
Read(f,c);
if c='1' then a[i,j]:=-1 else a[i,j]:=0;
b[i,j]:=0
end;
ReadLn(f)
end;
Close(f);
k:=0;
for i:=1 to n do for j:=1 to m do if a[i,j]=-1 then begin
Inc(k);
Mark(i,j)
end;
WriteLn(k,' bushes');
for i:=1 to n do begin
for j:=1 to m do if a[i,j]>0 then Write(a[i,j]) else Write(' ');
WriteLn
end
end.
В этом решении я считаю, что связь только по горизонтали или вертикали (по диагонали не считается).

Сообщение отредактировано: Lapp - 15.02.2009 17:00


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



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