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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2015, 16:46   #21
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
А блоки нет . Разбитие стены на независимые прямоугольные участки по мне годное решение.
Смотри на предыдущей странице, я уже приводил пример.

Разбиение стены на независимые прямоугольные участки - это было бы идеальное решение. Только для произвольной стены такое разбиение выполнить невозможно. Ключевое слово при этом - НЕЗАВИСИМЫЕ.
rrrFer вне форума Ответить с цитированием
Старый 09.04.2015, 17:13   #22
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Ключевое слово при этом - НЕЗАВИСИМЫЕ.
Да это автоматически отметает некоторые решения. Сужает возможное число вариантов. Но не факт, что те варианты действительно годные. В общем надо думать. Да и в случае неудачи можно вертикальные к примеру пересмотреть в горизонтальные.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 01.07.2015, 01:27   #23
Yazon2006
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 20
По умолчанию

Существует легенда, что Junior Java Developer может решить такую задачу, написать рабочий код, и документацию за двое суток. А посему есть мнение, что существует более изящное решение данной задачи, либо джуны нынче шибко грамотные пошли...
Yazon2006 вне форума Ответить с цитированием
Старый 01.07.2015, 09:23   #24
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
что Junior Java Developer может решить такую задачу, написать рабочий код, и документацию за двое суток.
РЕКУРСИЯ
берем блок, укладываем,(перебираем все варианты) получаем стену другой конфигурации, но меньшей площади.
и начинаем снова на "новой" стене с "новым" набором блоков, до тех пока не получим стену нулевой площади. (или не сможем найти подходящий блок).

НО, работать (до получения результата) эта программа будет 1 млрд. лет.

http://programmersforum.ru/showthrea...87#post1508787
Время написания программы ~30 мин. (включая время отладки!!)
Время работы программы до получения результата ....?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.07.2015 в 09:37.
evg_m вне форума Ответить с цитированием
Старый 02.07.2015, 18:56   #25
Yazon2006
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 20
По умолчанию

Я понимаю суть перебора, но не знаю как это реализовать. Рекурсия всегда была моим слабым местом. Кроме того их вращать можно (кирпичи), а это вообще выводит меня из состояния душевного спокойствия =)
Yazon2006 вне форума Ответить с цитированием
Старый 02.07.2015, 19:41   #26
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
TStena =class;
TBlock =class;
Tblocks =array of TBlock;// TObjectList;

function Most(stena: TStena; blocks: TBlocks): boolean;
begin
  result:=true;
  if stena.Square =0 then Exit; //стена имеет НУЛЕВУЮ площадь и стало быть ничего болле укладывать НЕ НАДО.
  
result:=false;
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 ???
         stn:=MostBlock(stena, blocks[j], x, y, z); // УКЛАДКА выбранного(j) блока на выбранное(x,y) место выбранным(z) образом!!
// в результате получаем НОВУЮ стенку или НИЧЕГО если уложить указанным образом НЕВОЗМОЖНО (закрываем дырки/выход за стенку/наложение)
    if stn<>nil then begin // при успешном размещении блока 
     // делаем все тоже самое , но уже для новой стенки !!та самая РЕКУРСИЯ !!!
       result:=Most(Stn, blocks); // список блоков оставляем прежним (СЧИТАЕМ что КОЛИЧЕСТВО блоков КАЖДОГО формата у нас не ограничено
    if result then break; // У НАС ПОЛУЧИЛОСЬ и мы радостно заканчиваем КАЖДЫЙ из переборов
 end;
 if result then break;
end;
 if result then break;
end;
if result then break;
end;

end;
В теме по ссылке есть готовый и рабочий код.
алгоритмически почти идентичный приведенному.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.07.2015 в 19:47.
evg_m вне форума Ответить с цитированием
Старый 02.07.2015, 22:46   #27
Yazon2006
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 20
По умолчанию

Хм! Красота) Но! Действительно таки долго наверное будет делаться)
я вот кстати погуглил по этому поводу и нашёл:
Руднев Антон Сергеевич "Алгоритмы локального поиска для задач двумерной упаковки"
А именно РАЗДЕЛ 2. Алгоритм имитации отжига для задач прямоугольной упаковки в контейнеры с запрещенными областями.
ИМХО, это то что надо.
Yazon2006 вне форума Ответить с цитированием
Старый 02.07.2015, 23:06   #28
Yazon2006
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
СЧИТАЕМ что КОЛИЧЕСТВО блоков КАЖДОГО формата у нас не ограничено
А количество блоков таки задано конкретно для каждого конкретного размера (
Yazon2006 вне форума Ответить с цитированием
Старый 03.07.2015, 01:48   #29
Yazon2006
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 20
По умолчанию

Пока были силы что то получалось, но в каком то месте не работает. На дебаг сил не хватило.

Код:
import java.util.ArrayList;


public class Upakovka {
    private static class Stena {
        public byte [][] array = new byte[][] {
                {0, 1, 0, 1, 1, 0, 1, 0},
                {1, 1, 1, 1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1, 1, 1, 1},
                {1, 1, 1, 1, 1, 1, 1, 1},
        };

        public Stena(Stena stena) {
//            array = stena.array;
            System.arraycopy(stena.array, 0, array, 0, stena.array.length );
        }

        public Stena() {

        }

        int getWidth() {
            return array[0].length;
        }

        int getHeight() {
            return array.length;
        }

        int getSquare() {
            int count = 0;
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    if(array[i][j] == 1) count++;
                }
            }
            return count;
        }

        public boolean cut(Block block, int x, int y, int z) {
        	if(!check(block, x, y, z))
        		return false;
            int w = z == 0 ? block.getWidth() : block.getHeight();
            int h = z == 0 ? block.getHeight() : block.getWidth();
            for (int i = 0; i < w; i++) {
                for (int j = 0; j < h; j++) {
//                	if(array[x+i][y+j] == 0) return false;
                    array[x+i][y+j] = 0;
                }
            }
            return true;
        }
        
        public boolean check(Block block, int x, int y, int z) {
            int w = z == 0 ? block.getWidth() : block.getHeight();
            int h = z == 0 ? block.getHeight() : block.getWidth();
            if(y + h > getWidth()) return false;
            if(x + w > getHeight()) return false;
            for (int i = 0; i < w; i++) {
                for (int j = 0; j < h; j++) {
                	if(array[x+i][y+j] == 0) return false;
                }
            }
            return true;
        }
    }

    private static class Block {
        private int width;
        private int height;

        Block(int width, int height) {
            this.width = width;
            this.height = height;
        }

        public int getWidth() {
            return width;
        }

        public int getHeight() {
            return height;
        }
    }

    private static boolean Most(Stena stena, Block[] blocks) {
        boolean result = true;
        if(stena.getSquare() == 0) {
            // Exit;
        }
        result = false;
        for (int j = 0; j < blocks.length - 1; j++) {
            for (int x = 0; x < stena.getWidth() - 1; x++) {
                for (int y = 0; y < stena.getHeight() - 1; y++) {
                    for (int z = 0; z < 2; z++) {
                        Stena stn = MostBlock(stena, blocks[j], x, y, z);
                        if(stn != null) {
                            result = Most(stn, blocks);
                        }
                        if(result) break;
                    }
                    if(result) break;
                }
                if(result) break;
            }
            if(result) break;
        }
        return result;
    }

    private static Stena MostBlock(Stena stena, Block block, int x, int y, int z) {
		Stena newStena = new Stena(stena);
        if(newStena.cut(block, x, y, z))
       		return newStena;
        else
        	return null;
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
        Stena stena = new Stena();
        ArrayList<Block> list = new ArrayList<>();
        list.add(new Block(3, 4));
        list.add(new Block(3, 4));
        list.add(new Block(3, 4));
        list.add(new Block(3, 4));
        list.add(new Block(3, 4));
        
        list.add(new Block(1, 3));
        
        list.add(new Block(2, 1));
        list.add(new Block(2, 1));
        list.add(new Block(2, 1));
        list.add(new Block(2, 1));
        list.add(new Block(2, 1));
        list.add(new Block(2, 1));
        
        list.add(new Block(1, 1));
        list.add(new Block(1, 1));
        list.add(new Block(1, 1));
        list.add(new Block(1, 1));

        boolean res = Most(stena, list.toArray(new Block[list.size()]));
        System.out.print(res);
	}

}
Yazon2006 вне форума Ответить с цитированием
Старый 03.07.2015, 11:39   #30
Yazon2006
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 20
По умолчанию

Хотя конечно это все бред! Количество блоков в наличии не учитывается, и даже если найти баг из-за которого оно не перебирает все варианты, то stackoverflow гарантирован.
Yazon2006 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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