Тема: ACM SEERC 2009. The Computer Game Problem

Есть сетка, узлы которой имеют целочисленные координаты. M узлов этой сетки являются запрещенными, в остальные можно ставить точки, если координаты x и y точки удовлетворяют условию |x| + |y| < N. Точки можно ставить только в те узлы, которые еще свободны (т.е. все точки должны быть различны). Каждая пара точек должна иметь связь (возможно через другие точки). Две точки (x1, y1) и (x2, y2) считаются связанными, если |x1 – x2| + |y1 – y2| = 1.

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

Входные данные:
T - количество тестов. Каждый тест начинается со строки, содержащей N и M. Следующие M строк содержат координаты x,y запрещенных узлов.

Выходные данные:
Для каждого теста вывести количество способов размещения точек.

Ограничения:
T = 74,
1 ? N ? 7,
1 ? M ? 225,
-7 ? Xk, Yk ? 7, все (Xk, Yk) различны.
время 4 с, память 256 мб.

Пример ввода:
2
2 1
7 7
2 3
0 0
4 -7
7 -4

Пример вывода:
20
4

2

Re: ACM SEERC 2009. The Computer Game Problem

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

3

Re: ACM SEERC 2009. The Computer Game Problem

Мне кажется здесь будет что-то похожее на динамику по "рваному" профилю.

4

Re: ACM SEERC 2009. The Computer Game Problem

brainail пишет:

Мне кажется здесь будет что-то похожее на динамику по "рваному" профилю.

Да.
И еще, надо повернуть систему координат на 45 градусов чтобы избежать таймлимита

test

5

Re: ACM SEERC 2009. The Computer Game Problem

Извините, если задаю глупый вопрос, но что вообще такое динамика по "рваному" профилю? Когда мы говорим об обычной динамике по профилю, то, на сколько я знаю, профиль представляет собой битовую маску, каждый бит которой обозначает, например, стоит ли точка в узле. Применить такую динамику к этой задаче у меня не получилось, а что здесь будет "рваным" профилем?

6

Re: ACM SEERC 2009. The Computer Game Problem

На примере этой задачи:
   Представь что ты начинаешь заполнять свои точки сверху вниз. Тогда для каждой строки тебе важно знать что находилось только на предыдущей строке, и не больше (т.к. связи с предпредыдущей быть не может). Получается динамика вида F[I, J], где I - номер строки, J - "рваный" профиль, и F[I, J] - количество таких способов. J - это маска, только уже не битовая. В данной задаче, как я вижу (я пока ещё не писал), J это разбитие текущей строки по группам. Например для битовой 1010111 соответствует массиву 1 0 2 0 3 3 3, а после того как перейдем по 1110101 получится массив 1 1 1 0 2 0 2. Надо только в этом случае правильно рассмотреть все возможные и невозможные случаи перехода.

P.S. Но это как я понял, возможно и не так.

7

Re: ACM SEERC 2009. The Computer Game Problem

Возможно, при построении динамики нужно еще хранить текущее количество компонентов связности, т.е. динамика будет иметь вид ~ dp[profile, row, parts_num]. Хранить число способов только для полностью связного случая, мне кажется, недостаточно. Проиллюстрирую свою мысль на примере. Пусть в какой-то момент времени на поле были выбраны следующие точки (o - пустая позиция, * - точка):

o o o o o o o o o o
* o o o o o o o * *
* * o o o o o o o o

Расстановка такого вида пока мало интересна, но она может быть базой для следующих построений:

o o o o o o o o o o     o o o o o o o o o o     o o o o o o o o o o     o o o o o o o o o o     o o o o o o o o o o   o o o o o o o o o o
* o o o o o o o * *     * o o o o o o o * *     * o o o o o o o * *     * o o o o o o o * *     * o o o o o o o * *   * o o o o o o o * *
* * * o o o o o o o     * * * * o o o o o o     * * * * * o o o o o     * * * * * * o o o o     * * * * * * * o o o   * * * * * * * * o o

И в конечном счете для связного построения

o o o o o o o o o o
* o o o o o o o * *
* * * * * * * * * o

Насчет профиля, по-моему, важно знать не только то, что на предыдущей строке, но и то, что расположено на текущей строке, т.к. связи возможны и влево и вправо. Получается, что 30 бит было бы достаточно для того чтобы сохранить наличие точек на текущем и предыдущем ряду, но это слишком много. Понятно, здесь есть избыточность, но как от нее избавиться? Мне пока так и не удалось найти какую-то более-менее толковую информацию о динамическом программировании с "рваным" профилем (или "изломанным", если это одно и то же).

8

Re: ACM SEERC 2009. The Computer Game Problem

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

9

Re: ACM SEERC 2009. The Computer Game Problem

Поначалу построение может распадаться. Например,

* o o o *
* o o o *
o o o o o

может перейти в

* o o o *
* o o o *
* * * * *

Получается, что нужно как-то хранить и количество способов для нецелостного построения. Если я не прав, поясни как ты видишь динамику. Очень помог бы небольшой пример.

10

Re: ACM SEERC 2009. The Computer Game Problem

* o o o * -> 1 0 0 0 2
после добавление строки * o o o * комбинация останется такой же 1 0 0 0 2,
после добавление * * * * * комбинация превратся в 1 1 1 1 1,
потом если снова будет добавлять * o o o * комбинация будет уже такой 1 0 0 0 1,
а потом если добавим * o * o * комбинация станет такой 1 0 2 0 1,
добавим * o * * * комбинация станет 1 0 1 1 1.

11

Re: ACM SEERC 2009. The Computer Game Problem

если она есть онлайн, кинь ссыль, попробую поднять и может тебе по коду будет понятней

12 Отредактировано alt (2010-03-19 13:57:36)

Re: ACM SEERC 2009. The Computer Game Problem

http://acm.lviv.ua/fusion/viewpage.php? … mp;id=1288
(сайт на украинском языке)

UPD
а здесь тесты http://acm.ro/prob/ACMproblems2009.zip

test