Re[7]: Робот не мой, а государственный
От: RS Земля ICQ: 148844272
Дата: 31.03.03 07:26
Оценка:
Здравствуйте, Pushkin, Вы писали:

хъ

PolyminoLab — это сильно!

P>Вот так оно перебрало все лабиринты площадью 4. Площади 5 и 6 я ручками проверил, тоже вроде всё верно. Дальше надеюсь тоже не врёт. Считает довольно шустро.


А вот у меня на Атлоне 800 для N=12 считала час.

P>Ниже код, вполне готовый к компиляции. Основная идея не сильно изменилась — волновое распространение. Начинаем с верхней-левой клетки. В неё можно поставить трёх разных "ёжиков" — только_направо, только_вниз, направо_и_вниз. Пробуем поставить каждого и пораспространяться с этого обрывка. И так далее. Каждый раз, ставя ёжика, смотрим, куда он ОБЯЗАН торчать, а куда ПО ЖЕЛАНИЮ. Все желания реализуем по очереди. Основная проблема — перебрать быстро и уникально — для этого, как обычно, организуем fifo.


Можно четвертого — лысого. Но это для лабиринта из одной клетки.

P>Кодирующая последовательность мне здесь совсем не нужна — перебираю сразу раскодированные лабиринты. Но для понимания того, что происходит, могу описать. Каждый лабиринт кодируется линейкой полубайт — по одному на каждую занятую клетку. В каждом полубайте лежат 4 бита — наличие выходов из этой клетки во все 4 стороны. Они зависимы — каждая стенка по сути помечается дважды, поэтому кодировка явно не плотнейшая, но нам по фигу. Последовательность полубайт в линейке определяется распространением от верхней левой клетки — куда раньше пришли, та клетка раньше и описывает в линейке свои выходы.


У меня трех битов хватает — раз прошли в клетку, значит позади нас стенки нету.

P>Всё, на вопросы по коду готов ответить.

P>RS, как твой робот вылезет из площади 4, напиши, интересно.

Самому интересно, я еще не смотрел. В среду че-нить принесу.
А пока для 2x3 27, для 2x3&3x2 33, для 3x3 140.
Re[9]: С твоего робота пиво :)
От: Pushkin Россия www.linkbit.com
Дата: 31.03.03 07:38
Оценка:
Здравствуйте, RS, Вы писали:

RS>P.S. Вот кой-какие результаты:


RS>1: 1

RS>2: 2
RS>3: 6
RS>4: 23
RS>5: 95
RS>6: 420
RS>7: 1920
RS>8: 9047
RS>9: 43462
RS>10: 212203
RS>11: 1049053
RS>12: 5239622

RS>P.P.S. Я то знаю, у Пушкина прога с минуты на минуту для N=50 лабиринты выдаст.


У меня за минуту Celeron 1200 посчитал N=13.

Но хуже другое — начиная с N=8 у нас с тобой результаты расходятся!!! У меня 9049.
Как проверить, кто прав, не знаю. Ау, MichaelP, где твои любимые сайты?
Возможно N=8 выделно тем, что это первая площадь, где возможна честная петля.
Re[8]: Робот не мой, а государственный
От: Pushkin Россия www.linkbit.com
Дата: 31.03.03 07:47
Оценка:
Здравствуйте, RS, Вы писали:

RS>Можно четвертого — лысого. Но это для лабиринта из одной клетки.


Лысых не учитываем

RS>У меня трех битов хватает — раз прошли в клетку, значит позади нас стенки нету.


Думаю, если поставить такую задачу, то можно и ещё зажать. КАЖДАЯ ВНУТРЕННЯЯ стенка может быть учтена лишь один раз.

RS>А пока для 2x3 27, для 2x3&3x2 33, для 3x3 140.


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

Сколько стенок можно поставить в кваднате NxN так, чтобы он остался односвязным?

Re[10]: С твоего робота пиво :)
От: RS Земля ICQ: 148844272
Дата: 31.03.03 07:51
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>Но хуже другое — начиная с N=8 у нас с тобой результаты расходятся!!! У меня 9049.

P>Как проверить, кто прав, не знаю. Ау, MichaelP, где твои любимые сайты?
P>Возможно N=8 выделно тем, что это первая площадь, где возможна честная петля.

Ну тут три варианта:
1. У тебя есть одинаковые — проверь (само изображение).
2. У меня чего-то не хватает (а вот тут хрен проверишь — 9 килолабиринтов — сдохнуть можно).
3. Сочетание (1) и (2).
Re[9]: Робот не мой, а государственный
От: RS Земля ICQ: 148844272
Дата: 31.03.03 07:57
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>Лысых не учитываем


Вообще лысых — конечно. Но если не четыре бита, а три — то вполне будут лысые (то, через что пришли — не иголка, а что-то еще).

P>Думаю, если поставить такую задачу, то можно и ещё зажать. КАЖДАЯ ВНУТРЕННЯЯ стенка может быть учтена лишь один раз.


Более того — у меня не стабильно три бита, а от 0 до трех. Смотри код. То есть, если решили, что тут стенка есть, а тут ее нет, то в обоих случаях, оказавшись в соседних клетках, эти стенки уже не рассматриваем, и биты на них не отводим.

P>Мне кстати не очевидно, как ты генеришь стенки для скажем 3х3.

P>Надо же, чтоб односвязным получилось.
P>Неужели просто генеришь все варианты стенок и проверяешь, зальётся ли?

Мне очень стыдно, но до позавчера я именно так и делал

P>Может есть какой особый алгоритм быстрого перебора для прямоугольных лабиринтов?


Может и есть.

P>Кстати задача:

P>

P>Сколько стенок можно поставить в кваднате NxN так, чтобы он остался односвязным?


Для 3х3 внутренних стенок максимум 4 (из 12).
Re[11]: С твоего робота пиво :)
От: Pushkin Россия www.linkbit.com
Дата: 31.03.03 09:31
Оценка:
Здравствуйте, RS, Вы писали:

RS>Ну тут три варианта:

RS>1. У тебя есть одинаковые — проверь (само изображение).

Хорошо, проверю. Не изображение, конечно
Множество поюзаю эстээльное...

RS>2. У меня чего-то не хватает


Очень надеюсь
Re[12]: С твоего робота пиво :)
От: RS Земля ICQ: 148844272
Дата: 31.03.03 09:41
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>Хорошо, проверю. Не изображение, конечно

P>Множество поюзаю эстээльное...

Ну конечно не изображение, но и не его представление в виде кодирующей последовательности.

RS>>2. У меня чего-то не хватает


P>Очень надеюсь


Если у меня не хватает, я бы попросил тебя прислать мне на мыло все твои 9 килолабиринтов в некотором общем для нас формате, и я тогда буду сравнивать.
Готов начать обсуждение формата. Но ты сперва у себя дупликаты поищи, это все-таки проще (для меня, во всяком случае).

P.S. Что-то мне подсказывает (лень, скорее всего), что у меня все правильно.
Re[13]: С твоего робота пиво :)
От: Pushkin Россия www.linkbit.com
Дата: 31.03.03 10:06
Оценка:
Здравствуйте, RS, Вы писали:

RS>Ну конечно не изображение, но и не его представление в виде кодирующей последовательности.

RS>Если у меня не хватает, я бы попросил тебя прислать мне на мыло все твои 9 килолабиринтов в некотором общем для нас формате, и я тогда буду сравнивать.
RS>Готов начать обсуждение формата. Но ты сперва у себя дупликаты поищи, это все-таки проще (для меня, во всяком случае).

OK, но не факт что сегодня...
Re[14]: С твоего робота пиво :)
От: RS Земля ICQ: 148844272
Дата: 31.03.03 10:13
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>OK, но не факт что сегодня...


Ну я и сам попробую, сорец-то твой есть.
Но что-то мне не нравится идея, что у тебя у стенок нет неопределенного состояния. Эдак, не поставив стенку один раз, мы можем поставить ее, подойдя к ней с другой стороны. И тогда две разные кодирующие последовательности опишут один, по сути, лабиринт.
Поправь (сегодня), если я чего не понял.
Re[15]: С твоего робота пиво :)
От: Pushkin Россия www.linkbit.com
Дата: 31.03.03 10:23
Оценка:
Здравствуйте, RS, Вы писали:

RS>Здравствуйте, Pushkin, Вы писали:


P>>OK, но не факт что сегодня...


RS>Ну я и сам попробую, сорец-то твой есть.

RS>Но что-то мне не нравится идея, что у тебя у стенок нет неопределенного состояния. Эдак, не поставив стенку один раз, мы можем поставить ее, подойдя к ней с другой стороны. И тогда две разные кодирующие последовательности опишут один, по сути, лабиринт.
RS>Поправь (сегодня), если я чего не понял.

Поместив ёжика куда-то, мы поместили его всего, такого, какой он есть, со всеми его иголками и мягкими боками. Всякий другой ёжик перед тем как сесть в другую клетку исследует соседей. Если от соседа торчит иголка, то и он пускает. А если там мягко, то не пускает. В те же стороны, где нет соседей, ёжик пускает иголки по желанию, т.е. и так и так.

Иными словами у моих кодирующих последовательностей есть жёсткое свойство — всякая внутренняя стенка или отсутствие внутренней стенки описано ровно дважды , причём одинаково.

А неопределённые состояния у меня есть только для клеток.
Re[16]: С твоего робота пиво :)
От: RS Земля ICQ: 148844272
Дата: 31.03.03 10:33
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>Поместив ёжика куда-то, мы поместили его всего, такого, какой он есть, со всеми его иголками и мягкими боками. Всякий другой ёжик перед тем как сесть в другую клетку исследует соседей. Если от соседа торчит иголка, то и он пускает. А если там мягко, то не пускает. В те же стороны, где нет соседей, ёжик пускает иголки по желанию, т.е. и так и так.


P>Иными словами у моих кодирующих последовательностей есть жёсткое свойство — всякая внутренняя стенка или отсутствие внутренней стенки описано ровно дважды , причём одинаково.


P>А неопределённые состояния у меня есть только для клеток.


Да, все вроде правильно. И не придраться.

А вот как у меня (может найдешь ошибку?).
У стенок есть три состояния — стенка, проход, неопределено. Когда ставим ежика, его иголки и мягкие бока направляем только в стороны неопределенных стенок. Новый ежик добавляется в фифо, скажем, в начало. Развитие (гду будет следующий ежик) определяется последним ежиком из фифо, чей проход открыт в свободную клетку.

Похоже, все тоже самое, но у тебя попроще (и явно быстрее).
Re[17]: С твоего робота пиво :)
От: Pushkin Россия www.linkbit.com
Дата: 31.03.03 11:03
Оценка:
Здравствуйте, RS, Вы писали:

RS>А вот как у меня (может найдешь ошибку?).

RS>У стенок есть три состояния — стенка, проход, неопределено.

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

Возможно ошибка в том (у меня была, я долго не мог въехать), что одна и та же клетка закидывается в фифу дважды с разных сторон — ещё прошлый инстанс не обработали, он ждёт своей очереди, а уже следующий зачем-то поставили. У меня для борьбы с этим примочка с "-2" служит. Но оно правда раньше проявлялось, для меньших N...
Re[18]: С твоего робота пиво :)
От: RS Земля ICQ: 148844272
Дата: 31.03.03 11:11
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>Возможно ошибка в том (у меня была, я долго не мог въехать), что одна и та же клетка закидывается в фифу дважды с разных сторон — ещё прошлый инстанс не обработали, он ждёт своей очереди, а уже следующий зачем-то поставили. У меня для борьбы с этим примочка с "-2" служит. Но оно правда раньше проявлялось, для меньших N...


Исключено. Тогда бы у меня больше насчиталось. А до использования рекурсии я пока не дошел.
Re[18]: С твоего робота пиво :)
От: RS Земля ICQ: 148844272
Дата: 31.03.03 11:18
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>Возможно ошибка в том (у меня была, я долго не мог въехать), что одна и та же клетка закидывается в фифу дважды с разных сторон — ещё прошлый инстанс не обработали, он ждёт своей очереди, а уже следующий зачем-то поставили. У меня для борьбы с этим примочка с "-2" служит. Но оно правда раньше проявлялось, для меньших N...


А эта неестественная "примочка" тебя не раздражает? Я пока до ее смысла не дошел, ибо не читал код. Может из-за нее у тебя насчитываются лишние?
Re[19]: С твоего робота пиво :)
От: Pushkin Россия www.linkbit.com
Дата: 31.03.03 11:27
Оценка:
Здравствуйте, RS, Вы писали:

P>>Возможно ошибка в том (у меня была, я долго не мог въехать), что одна и та же клетка закидывается в фифу дважды с разных сторон — ещё прошлый инстанс не обработали, он ждёт своей очереди, а уже следующий зачем-то поставили. У меня для борьбы с этим примочка с "-2" служит. Но оно правда раньше проявлялось, для меньших N...


RS>А эта неестественная "примочка" тебя не раздражает? Я пока до ее смысла не дошел, ибо не читал код. Может из-за нее у тебя насчитываются лишние?


Всё может быть, вскрытие покажет
На самом деле она не такая уж неестественная, я к ней спокойно отношусь. Просто в процессе подсчёта объективно есть 4 типа клеток:

0    - ежа нету и быть не может (вверху)
-1   - фиг его знает, есть ли там ёжик
-2   - ёжик точно есть (т.к. другие ёжики пальцем показали), но неясно какой, надо ещё проверить
1-15 - стоит вполне определённый ёжик
Re[20]: Пиво
От: RS Земля ICQ: 148844272
Дата: 02.04.03 07:58
Оценка:
Прав был Пушкин, а я не прав.

Но!
Ошибка у меня была не в Decode, а в Enum, и вот какая она была:
Enum у меня работает так же, как в первой версии проги Пушкина, которая полимино считала.
Смотрим:
13665040 — Decode говорит, что она плохая,
13665100 — и эта тоже плохая.
И дальше Enum проверяет 13666000 (так уж Enum устроен), и пропускает 13665213. Точно так же была пропущена и еще одна, опять таки по вине Enum.
Итого из 8 клеток 9049 лабиринтов.

Теперь про робота.
По лабиринтам из трех клеток одна последовательность из 9-ти команд (и 7 ее поворотов и отражений):
DRDURLUDL

А вот для четырех клеток я пока не порверил. Просто из-за лени я начал полным последовательным перебором — и пока не добрался. Но в последовательности больше 15-ти команд, это уже точно известно.
Re[21]: Пиво
От: Pushkin Россия www.linkbit.com
Дата: 02.04.03 08:16
Оценка:
Здравствуйте, RS, Вы писали:

RS>Прав был Пушкин, а я не прав.


Прости

RS>И дальше Enum проверяет 13666000 (так уж Enum устроен), и пропускает 13665213. Точно так же была пропущена и еще одна, опять таки по вине Enum.


Мне вообще всегда чудом казалось, что сложные алгоритмы работают

RS>А вот для четырех клеток я пока не порверил. Просто из-за лени я начал полным последовательным перебором — и пока не добрался. Но в последовательности больше 15-ти команд, это уже точно известно.


Ну, это и я да 18 дошёл.
Имхо полный перебор ценнее.
Если его удаётся провести быстро.
Но поиски вширь и вглубь тоже очень интересны.
Как говорится, "не можешь как надо — сделай как можешь"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.