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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2015, 12:55   #31
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Количество блоков в наличии не учитывается,
Теперь учитывается ! block[j].count
и мы перестали каждый раз генерить новую стену, вносим все изменения в исходную и откатываем назад если надо.

Код:
for j:=0 to blocks.Length-1 do begin // перебираем ВСЕ доступные нам блоки
  for x:=0 to steha.with-1 do begin // перебираем ВСЕ возможные позиции нового по горизонтали
    for y:=0 to stena.hight-1 do begin // позиции по вертикали
      for z:=0 to 3 do begin //разные расположения блока НА ОДНОМ месте (4 поворота) если будут еще и перевороты зеркальные отражения то надо изменить на 7 ???
        if stena.Enable(block[j], x, y, z) // проверяем можно ли положить выбранный(j) блок на выбранное(x,y) место выбранным(z) образом 
            and ( block[j].count>0 ) // и ЕСТЬ ЛИ ЕЩЕ такой блок !!! ЭТО конечно же можно проверять заранее (в начале цикла for j ... и при необходимости СРАЗУ переходить к следующему блоку {continue;}
         then begin 
          stena.Set(block[j], x, y, z); // КЛАДЕМ блок
          Dec(block[j].count); // для следующих итераций отмечаем взятие блока (уменьшаем их доступное количество)
                              // делаем все тоже самое , но уже для новой стенки !!та самая РЕКУРСИЯ !!!
          result:=Most(Stena, blocks); // Мы уже изменили и стену и состав блоков 
          if result then break; // У НАС ПОЛУЧИЛОСЬ и мы радостно заканчиваем КАЖДЫЙ из переборов

              // А вот если нас постигла неудача то 
          stena.RemoveBlock(block[j], x, y, z); //УБЕРЕМ блок из стены
          Inc(block[j].count); // и ВЕРНЕМ блок на место (увеличим их количество)
        end;
        if result then break;
      end;
      if result then break;
    end;
    if result then break;
  end;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.07.2015 в 12:57.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Facebook, Post-запрос на стене Chuck_ C# (си шарп) 4 04.09.2014 21:13
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel Toofed Помощь студентам 0 30.11.2011 01:12
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51