Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2013, 20:58   #1
HalvaForever
Новичок
Джуниор
 
Регистрация: 17.03.2013
Сообщений: 5
По умолчанию не могу доделать задачу

доброго времени суток! в школе учитель дал задачу, которую нужно через паскаль решить. задача: дан лес, нужно поджечь дерево и рассчитать время горения леса. вообщем лес я создал и выбрал дерево, с которого начнется пожар. дальше я делаю проверку через цикл for каждого дерева, стоит ли оно рядом с только что подоженным. если бы рядом стояло только одно дерево и дальше всегда стояло бы только одно дерево, то все просто. а я не знаю, что делать, когда сразу несколько деревьев рядом, как дальше от них вести счет. подскажите. мне решение не нужно, нужно что-то типа совета.
HalvaForever вне форума Ответить с цитированием
Старый 17.03.2013, 21:20   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

То есть вам нужно как бы распараллелить алгоритм на несколько деревьев?
Обычно это делается припомощи структуры данных типа стек или очередь.
Предполагаю, что горение у Вас организовано по тактам - каждый такт "поджигает" новую порцию деревьев.
Тогда нужно применить очередь.
С одной стороны в нее запихиваются те деревья, что вновь подожжены, а с другой - добываются горящие деревья, которые должны поджечь соседние.
s-andriano вне форума Ответить с цитированием
Старый 17.03.2013, 21:29   #3
HalvaForever
Новичок
Джуниор
 
Регистрация: 17.03.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
То есть вам нужно как бы распараллелить алгоритм на несколько деревьев?
Обычно это делается припомощи структуры данных типа стек или очередь.
Предполагаю, что горение у Вас организовано по тактам - каждый такт "поджигает" новую порцию деревьев.
Тогда нужно применить очередь.
С одной стороны в нее запихиваются те деревья, что вновь подожжены, а с другой - добываются горящие деревья, которые должны поджечь соседние.
вы все правильно поняли! пойду искать информацию об очереди
HalvaForever вне форума Ответить с цитированием
Старый 17.03.2013, 21:38   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

HalvaForever

задача: дан лес, нужно поджечь дерево и рассчитать время горения леса.

Ознакомь учителя с Уголовным Кодексом РФ:

Статья 261. Уничтожение или повреждение лесов
1. Уничтожение или повреждение лесов, а равно насаждении, не входящих в лесной фонд, в результате неосторожного обращения с огнем или иными источниками повышенной опасности —
наказываются штрафом в размере от двухсот до пятисот минимальных размеров оплаты труда или в размере заработной платы или иного дохода осужденного за период от двух до пяти месяцев, либо исправительными работами на срок до двух лет, либо лишением свободы на срок до двух лет.
2. Уничтожение или повреждение лесов, а равно насаждений, не входящих в лесной фонд, путем поджога, иным общеопасным способом либо в результате загрязнения вредными веществами, отходами, выбросами или отбросами —
наказываются лишением свободы на срок от трех до восьми лет.
Rififi вне форума Ответить с цитированием
Старый 17.03.2013, 21:41   #5
HalvaForever
Новичок
Джуниор
 
Регистрация: 17.03.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
HalvaForever

задача: дан лес, нужно поджечь дерево и рассчитать время горения леса.

Ознакомь учителя с Уголовным Кодексом РФ:

Статья 261. Уничтожение или повреждение лесов
1. Уничтожение или повреждение лесов, а равно насаждении, не входящих в лесной фонд, в результате неосторожного обращения с огнем или иными источниками повышенной опасности —
наказываются штрафом в размере от двухсот до пятисот минимальных размеров оплаты труда или в размере заработной платы или иного дохода осужденного за период от двух до пяти месяцев, либо исправительными работами на срок до двух лет, либо лишением свободы на срок до двух лет.
2. Уничтожение или повреждение лесов, а равно насаждений, не входящих в лесной фонд, путем поджога, иным общеопасным способом либо в результате загрязнения вредными веществами, отходами, выбросами или отбросами —
наказываются лишением свободы на срок от трех до восьми лет.
спасибо, вы очень помогли
HalvaForever вне форума Ответить с цитированием
Старый 17.03.2013, 21:54   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Вечер Добрый.
Могу предложить еще такой вариант :
Берем массив (для наглядности - массив_символов)
Инициализируем лес
Код:
for i := 1 to CntRow
     for j := 1 to CntCol do
         forest[i, j] := Tree;
Ставим границы по краям массива
Код:
procedure PutBoders (var forest : TForest);
var
        i, j : Integer;
begin
        for i := 0 to CnstRow+1 do begin
                forest[i, 0] := Boder;
                forest[i, CnstCol+1] := Boder
        end;

        for i := 0 to CnstCol+1 do begin
                forest[0, i] := Boder;
                forest[CnstRow+1, i] := Boder
        end
end;
Далее выбираем поджигаемое дерево.
Код:
Write('Coordinates Of Burnt Tree : '); ReadLn (n, m);
А затем поджигаем все деревья рядом стоящие с данным деревом :
Код:
BurnTree (forest, n, m, 1);
Код:
procedure BurnTree (var forest : TForest; const n, m, k : Integer);

begin
          for i := n-k to n+k do
               for j := m-k to m+k do
                      if forest[i, j] = Tree then
                            forest[i, j] := Burn;

         PrintForest(forest);

         BurnTree (forest, n)     
end;
Тоесть будет рекурсия.. Да это не эффективно.. Но работать будет (если Вы найдете "дно рекурсии")

Внимание! Т.к. уже поздно и дел у меня не початый край - я писал всё прямо в браузере..


UPDATE
Т.к. Вам выводить лес не обязательно, то можно всё более-менее упростить..

Код:
if forest[n-1, m] = Tree then begin
        forest[n-1, m] := Burn;
        BurnTree (forest, n-1, m)
end;

if forest[n+1, m] = Tree then begin

// etc
Использую 2-ой способ всё будет настолько просто, что шансы допустить ошибку будут ужасно малы.. Но за эту простоту Вам придется заплатить выводом..

Последний раз редактировалось Poma][a; 17.03.2013 в 22:04.
Poma][a вне форума Ответить с цитированием
Старый 17.03.2013, 22:22   #7
HalvaForever
Новичок
Джуниор
 
Регистрация: 17.03.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от 'Poma
BurnTree (forest, n-1, m)
что значит эта запись?
HalvaForever вне форума Ответить с цитированием
Старый 17.03.2013, 22:24   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А что такое пользовательские процедуры\функции Вы знаете?
Poma][a вне форума Ответить с цитированием
Старый 17.03.2013, 22:27   #9
HalvaForever
Новичок
Джуниор
 
Регистрация: 17.03.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
А что такое пользовательские процедуры\функции Вы знаете?
видимо нет
HalvaForever вне форума Ответить с цитированием
Старый 17.03.2013, 22:27   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Poma][a, фактически Вы предлагаете реализацию совпадающую с распространением волны в волновом алгоритме. Там существуют достаточно эффективные алгоритмы, как правило, с применением той же очереди.
Плюс такого подхода - гораздо менее ресурсоемко находить соседей (хотя и здесь есть эффективные способы), минус - довольно странная метрика dist := min(dx,dy); вместо привычного dist := sqrt(sqr(dx) + sqr(y));, ну и деревья допустимо помещать только в узлах сетки, а не где попало.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно доделать задачу гоша37 Паскаль, Turbo Pascal, PascalABC.NET 0 27.11.2012 12:18
доделать задачу Sylar9 Общие вопросы C/C++ 0 06.05.2012 11:48
Не могу доделать задачу X-REY Паскаль, Turbo Pascal, PascalABC.NET 1 25.10.2011 20:50
Помогите доделать задачу n1ce > Kuzia Паскаль, Turbo Pascal, PascalABC.NET 2 08.01.2009 11:42
Помогите доделать задачу!!!! Vincenzo Паскаль, Turbo Pascal, PascalABC.NET 4 11.05.2008 09:35