Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   "Микрочип" - задачка олимпиадного типа (http://forum.oszone.net/showthread.php?t=172500)

ArtTema 07-04-2010 21:29 1387418

"Микрочип" - задачка олимпиадного типа
 
Здрасте всем!!))

Народ, помогите решить олимпиадную задачку по проге. Бъюсь уже больше недели и всё никак не получается. Она на динамику. Предложите идею в более мение развёрнутом виде или может есть ссылка на разбор(думаю, задача не оригинальная и похожее что-то должно быть в сети, вот только найти у меня, увы, не получилось). Заранее благодарен.)))
Ответы можно ( Отправить в PM)

Вот, собственно и она:


«Микрочип»

Время на тест 1 секунда



Условие

Микрочип, производимый на некотором заводе, имеет форму плоского квадрата со стороной A микрометров. На нижнюю грань выведены контакты, причем координаты этих контактов в системе координат, в которой оси сонаправлены сторонам чипа, а единичный отрезок имеет длину 1 мкм, являются целыми числами. Для успешной распайки необходимо от каждого контакта протянуть проводящую дорожку к одной из сторон чипа для последующего закрепления на ноге интегральной схемы. Однако используемый технологический процесс позволяет создавать только прямые дорожки, идущие от контакта к краю чипа без изгибов и параллельные сторонам кристалла, причем невозможно проложить одну дорожку под или над другой. Поэтому Вам необходимо определить, в какую сторону выводить каждый из контактов так, чтобы полученные дорожки не пересекались, а суммарная их длина была минимальной.

Входные данные

В первой строке входного файла input.txt находится натуральное A (1 ≤ A ≤ 30) — сторона микрочипа в миллиметрах. Во второй строке находится натуральное N (1 ≤ N ≤ 38) — число контактов на нижней стороне чипа. В последующий N строках следуют пары целых чисел в диапазоне от 1 до A-1 — соответственно абсциссы и ординаты контактов во введенной системе координат.

Выходные данные

В выходном файле output.txt выведите в первой строке число S — минимальную суммарную длину необходимых дорожек. В последующий строках поясните, в какую сторону выводить дорожку для каждого из контактов: в (i+1)-й строке выведите одно из слов UP (англ. «вверх»), DOWN (англ. «вниз»), LEFT (англ. «влево»), RIGHT (англ. «вправо») - направление выведения дорожки i-го контакта.

Пример входных данных



15
15
11 13
6 4
13 3
4 12
5 5
4 9
1 14
3 11
9 7
2 12
1 10
12 2
7 6
8 8
12 1

Пример выходных данных


50
UP
DOWN
RIGHT
UP
LEFT
LEFT
UP
LEFT
RIGHT
LEFT
LEFT
RIGHT
DOWN
UP
DOWN

Drongo 07-04-2010 22:09 1387440

ArtTema, Есть хоть какое-то решение? Или вы предлагаете писать за вас? :)

ArtTema 07-04-2010 23:56 1387509

Нет, писать я не предлагаю вовсе :) Мне нужна какая-нибудь рабочая идея, алгоритм, который можно было бы реально закодить :) У меня есть некоторые соображения, но они достаточно обстрактны и конкретизировать у меня не получается, вот и обращаюсь за помощью :)

pva 08-04-2010 11:01 1387748

решите врукопашную такую расстановку:
Код:

+-----+
| ... |
| ... |
| ... |
|    |
+-----+

излагай идеи

delog 08-04-2010 12:38 1387836

А это точная формулировка задачи?
Цитата:

Микрочип...имеет форму плоского квадрата... На нижнюю грань выведены контакты
Квадрат - это двухмерная фигура, она не может быть ни плоской ни толстой.
Грань - это плоскость у объемной фигуры.

Значит формулировка должна начинаться:
На нижнюю грань микрочипа, имеющую форму квадрата, выведены...

И кроме того:
Цитата:

Цитата pva
решите врукопашную такую расстановку:
Код:

+-----+
| ... |
| ... |
| ... |
|      |
+-----+

»

Если все дорожки должны быть параллельны сторонам чипа, не пересекаться и не изгибаться, то как при таких условиях можно провести дорожку из центра?

CyberDaemon 08-04-2010 13:05 1387862

Цитата:

Цитата delog
Если все дорожки должны быть параллельны сторонам чипа, не пересекаться и не изгибаться, то как при таких условиях можно провести дорожку из центра? »

Никак, при таких начальных условиях задача не имеет решения.
Там же пример дан, если его нарисовать, то не будет там "заблокированных" контактов.

delog 08-04-2010 19:47 1388190

Точно, чужая иллюстрация меня немного сбила с мысли. Сходу могу предожить такой алгоритм:

1. посчитать "вес" каждой точки - если от нее можно провести дорожку во все стороны, то ее вес = 4, если в три стороны, то ее вес = 3 и т.д.

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

3. если еще есть свободные точки, то перейти к п.1, иначе п.4

4. конец

Но это сходу, врядли это идеальный вариант.

pva 09-04-2010 07:47 1388480

Цитата:

Цитата CyberDaemon
Там же пример дан, если его нарисовать, то не будет там "заблокированных" контактов. »

Если требуется режить только заданный пример- это можно сделать и без компьютера. Если требуется разработать программу для решения произвольного примера - придётся рассмотреть все варианты (хотя бы в отладочных целях)

дополняем алгоритм delog:
для каждой точки посчитали списки пар {длина, направление}. Отсортировали списки по длине, количеству элементов. текущее решение будет определяться списком указателей на элементы таблицы для каждой точки.
Дальше либо перебором, либо вертится в голове идея, аналог симплекс-метода, как сформулирую - напишу

Вот ещё пример (отладить вариант delog)
Код:

+---------+
|        |
|        |
| ..      |
|  .    |
|  .    |
|        |
+---------+


lxa85 11-04-2010 07:05 1389858

Можно попробовать подключить теорию графов. Критерий планарности/непланарности.
Я бы может предложит считать не вес точки, а "штрафы" т.е. расстояния до края по каждому направлению.
Можно попробовать построить дерево поиска с возвратом. Т
На начальном этапе отсечь тупиковые ветви. Например 2 точки на линии.
Далее рисовать граф, причем мы знает что с чем может быть соединено.
Можно не на каждом, можно для начала через 5/10/15 шагов производить оценку планарности. Т.к. это дорогостоящая операция. Затем конечно сократить кол-во шагов.

О!
Можно попробовать волновой алгоритм. С какой-нибудь его модификацией.
Можно попробовать решить обратную задачу. Т.е. найти минимальный остов.
http://ru.wikipedia.org/wiki/Минимал...стовное_дерево
Дерево Штайнера. http://book.itep.ru/3/stain_tree.htm
Также можно поискать задачи про укладку проводников.

pva 12-04-2010 08:43 1390545

Цитата:

Цитата lxa85
Можно попробовать решить обратную задачу. Т.е. найти минимальный остов.
http://ru.wikipedia.org/wiki/Минимал...стовное_дерево
Дерево Штайнера. http://book.itep.ru/3/stain_tree.htm »

вот это мне кажется не подходит, потому что здесь процесс с блокировками. К примеру вот вроде бы оптимальное решение, но оно не допустимо
Код:

+---------+
|        |
|        |
|        |
|        |
+-..      |
+--+.    |
|  |.    |
|  ||    |
+--++-----+

а допустимо такое:
Код:

+--+------+
|  |      |
|  |      |
|  |      |
|  |      |
+-..      |
+---.    |
|  .    |
|  |    |
+---+-----+

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

подумав-подумав допёрло как можно сделать. Нужно использовать принцип максимума понтрягина
. Пронумеруем контакты в любом порядке и начинаем поочереди их перебирать. За текущее состояние процесса принимаем направление обработанных дорожек + оставшиеся возможные направления необработанных (для каждого направления есть своя цена). Так как требуется найти интегральную цену (разделяемая на части сумма), этим принципом пользоваться можно.
Допустим мы уже сделали несколько ходов и у нас есть список возможных направлений для оставшихся дорожек. Тогда наши последовательные ходы должны быть такими, чтобы обеспечить наименьшее значение интеграла (суммарной цены). Мысленно доводим решение задачи до конца и начинаем раскручивать её обратно. На каждом шаге для контакта N (0<=N<=max(N)) и возможного направления I (0<=I<4) запоминаем рассчитываем наименьшую длину и запоминаем соответсвующую ей распайку контактов. Рассчёт ведётся из соображений, что сначала ни один контакт (из изначально не заблокированных) не заблокирован, потом что идеальный контакт заблокирован, потом что из оставшихся идеальный заблокирован и т.д.
На следующем шаге берём за основу полученные (максимум) 4 состояния, и рассчитываем схему с добавленным контактом. Итого потребуется вычислить (max(N)+1)*4 (возможно недоделанных) схем.

lxa85 12-04-2010 08:59 1390552

Цитата:

Цитата pva
вот это мне кажется не подходит »

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


Время: 19:10.

Время: 19:10.
© OSzone.net 2001-