Примітка. Це продовження та перегляд моєї іншої відповіді .
Проблеми зі скороченням
Нагадаємо проблему рішення:
Чи є досконала плитка, що покриває задану сітку з унікальними плитками?( n + 1 ) × ( n + 2 )н
Отже, для сітки ми можемо використовувати лише змінних.( n + 1 ) × ( n + 2 )н
Але:
- Наше скорочення вимагає безлічі унікальних змінних, набагато більше, ніж .O ( n )
- Крім того, наші дроти є відкритими, що призводить до:
- Як ми можемо знати, що ми можемо плитка відкритих ділянок?
Щоб вирішити першу проблему, ми штучно робимо ігрову дошку значно більшою; по суті, ми робимо рівним кількості змінних, яких ми насправді потребуємо, тоді створюємо сітку розміром і розміщуємо нашу сітку в лівому нижньому куті. Це призведе до квадратичного вибуху.( n + 1 ) × ( n + 2 )н( n + 1 ) × ( n + 2 )
Для другої проблеми ми повинні трохи переосмислити свої гаджети.
Це може здатися трохи непростим, щоб довести, що ми можемо успішно розкласти плитку за правилом. Отже, ми почнемо з тієї самої стратегії, яку використовували б, щоб насправді генерувати ігрові дошки розміром :( n + 1 ) × ( n + 2 )
Спочатку ми генеруємо набір усіх можливих плиток. Всі ці плитки доведеться розмістити на дошці. Потім виймаємо плитки, і залишаємо позаду їх квадрати.
Однак наші гаджети не гарантують розміщення конкретного набору плиток; розміщена плитка залежить від стану. Тому ми повинні ретельно модифікувати пристосування, щоб гарантувати, що конкретна плитка буде видалена, незалежно від того, який стан буде обрано.
Давайте потім переглянемо наші гаджети.
Провід і затвор-ворота є проблематичними з двох причин.
- Ми не знаємо, що квадрати, що оточують дріт або ворота, можуть бути викладені правильно; врешті-решт, деякі дроти можна просунути вліво, інші вправо, а обшивка рештою пробілів у квадраті стає нетривіальною. Ми будемо називати цю проблему проблемою "потоку".
- Неможливо дізнатися, які плитки зняти з набору плиток; в одному стані один набір квадратів у дроті або воротах із застереженнями буде викладений плиткою, в іншому - абсолютно інший набір квадратів.
Для вирішення цих питань:
- Спочатку ми генеруємо набір усіх можливих плиток. Всі ці плитки доведеться розмістити на дошці; як ми розмістимо їх на дошці, ми знімемо плитку з набору. Хоча ми, можливо, спочатку не знаємо , оскільки нам ще належить повністю описати рецептуру, ми можемо додати всі нові можливості плитки по мірі збільшення , за потреби. Усі плитки, які ми видаляємо з цього набору, повинні гарантовано розміщуватись (принаймні, гарантувати їх розміщення, якщо формула задовольняє). Ми називаємо видалення плитки з набору плиток, щоб "скинути" плитку з набору плиток, як для того, щоб виконати наш обов'язок розмістити її на ігровій дошці.nнн
- Ми повинні ретельно розробити гаджети, щоб гарантувати, що конкретна плитка буде видалена, незалежно від того, який стан буде обрано.
- Ми повинні закрити наші пристосування, щоб вони не штовхали плитки по всій дошці залежно від їх стану; швидше всі їхні держави повинні займати лише певну чітко визначену область.
- Крім того, всі їхні штати повинні бути гарантовані, щоб мати змогу зайняти чітко визначену територію; це гарантує приємне облицювання плитки, але не гарантує того, що відбудеться певна плитка. Це так само, як робиться гра Домінози:
- Спочатку плитки формуються в набір;
- Потім плитки розміщуються в довільній конфігурації,
- По мірі розміщення кожної плитки вона знімається з набору плиток.
- Потім плитку знімають з дошки, залишаючи позаду своїх квадратів.
- Це не гарантує, що буде вибрана намічена конфігурація ,
- Швидше, це гарантує, що призначена конфігурація може бути обрана, і, отже, рішення існує. Тут ми можемо зробити те ж саме.
- Розмістивши всі гаджети рецептури, замість того, щоб за замовчуванням розміщувати унікальні квадрати, тобто для всіх "пробілів", ми переконуємось, що пробіл - це прямокутна область з одним рівним розміром, або розбиваємо пробіл на прямокутники з один рівний вимір, і ми просто плитку пробілу залиште плиткою в наборі плиток.⋆
- Розмістивши всі плитки з набору, ми знаємо, що все можна розмістити.
- Деякі плитки будуть очевидно розміщуватися, наприклад, стіни, інші розміщуватимуться лише в тому випадку, якщо формула є задоволеною через характер взаємозв'язків між гаджетами.
- Потім виймаємо плитки, і залишаємо позаду їх квадрати.
Давайте потім переглянемо наші гаджети.
Примусовий гаджет
Ми можемо скласти довільну кількість будівельних блоків, переконавшись, що кожен з них не може бути сполучений з собою.
Наприклад, скажімо, що ми хочемо примусити плитку , щоб ми могли використовувати як будівельний блок. (зауважте, - це довільна змінна, яку ми хочемо примусити як пара до себе, не обов'язково будівельний блок, як ми раніше використовували значення )1 ⋆ 1 ⋆ 1( 1 ⋆ , 1 ⋆ )1 ⋆1 ⋆1
Щоб гарантувати, що наші -блоки резервування , ми розмістимо його на нижній стінці в наступна конфігурація: ми розмістимо зарезервований номер, назвемо його до стіни, як аплет (у формі ); проти стіни, і один у 2-му ряду посередині. Тоді ми помістимо ще два числа, назвемо їх і ; вони унікальні для цього гаджета. Розміщуємо їх вгорі зліва та справа .1 ⋆( 1 ⋆ , 1 ⋆ )1 ⋆⊥32 ⋆3 ⋆1 ⋆
Нижче показано, що загальна чорна облямівка - це нижня частина ігрової дошки, опис зліва направо.
- Конфігурація гаджета. Кожен та тут унікальний для цього гаджета.3 ⋆2 ⋆3 ⋆
- 3 можливі стани плитки центру .1 ⋆
Після цього ми можемо гарантувати, що наш гаджет може бути викладений певним набором плиток, гарантуючи при цьому, що наш гаджет повинен змусити пари.( 1 ⋆ , 1 ⋆ )
- Ми знаємо, що має відбуватися, тому що всі 3 можливі стани плитки нижньої середини 1 ⋆ , плитка як ( 1 ⋆ , 1 ⋆ ) , як показано на малюнку праворуч, вгорі.( 1 ⋆ , 1 ⋆ )1 ⋆( 1 ⋆ , 1 ⋆ )
- Решта плитки можуть бути викладені плиткою та ( 1 ⋆ , 3 ⋆ ) , що покриває гаджет. Таким чином, ми можемо видалити ці плитки з нашого глобального набору плиток. Проілюстровано нижче.(1⋆,2⋆)(1⋆,3⋆)
Опис, зліва направо:
- Зліва, вгорі: лівий стан, зліва, знизу: дійсна плитка решти квадратів.
- Середній, верхній: середній стан, середній, нижній: дійсна плитка решти квадратів.
- Вправо, вгорі: правий стан, праворуч, знизу: дійсна плитка решти квадратів.
Зауважте, що плитка залишків квадратів не є вимушеною , оскільки вони можуть плитка з сусідніми сусідами замість , але оскільки це дійсна плитка ігрової дошки у всіх штатах, ми можемо їх видалити з встановити плитку, і припустимо, що вони будуть викладені плиткою саме таким чином. Оскільки ми знаємо, що існує допустима можлива плитка, у нас є принаймні одна можлива плитка ігрової дошки, якщо формула задоволена. Хоча немає гарантії, що вони будуть викладені плиткою таким чином, є гарантія, що плитка ( 1 ⋆ , 1 ⋆ ) буде вимушена.1⋆( 1⋆,1⋆)
Примітка: якщо вас це не влаштовує, або вас бентежить різниця "вміння плитки" порівняно з "примушеним плиткою", ви можете просто розмістити стіну навколо гаджета , як і ми зробіть 3 × 2 стіни внизу для пункту-гаджета.3×23×2
Цей гаджет не закритий, тому що його не потрібно (але ви можете, якщо хочете). Це не повинно бути, оскільки він має можливу конфігурацію, яку ми можемо видалити з набору плиток. Хоча можливо зробити іншу конфігурацію, це не вплине на задоволеність проблеми.
Наступні плитки гарантовано підлягають плитці (таким чином їх можна видалити з набору плиток): ( 1⋆,1⋆)
Наступні плитки гарантовано зможуть оформити плиткою (таким чином їх можна видалити з набору плиток): ( 1 ⋆ , 2 ⋆ ) , ( 1⋆,3⋆)
Якщо ви вирішите закрити цей пристосування стіною, то також гарантовано буде накрито.( 1 ⋆ , 2 ⋆ ) , ( 1⋆,3⋆)
Нові ворота проводів та пропозицій
Через проблеми із течією та спорожненням плитки, нам потрібно трохи переробити дріт.
Один із способів вирішити проблему потоку - це зробити провід ланцюгом, а не просто простими ліво-правими станами; тобто це було б круговим замість лінії, і тому, якщо верхню частину кола відсунути вправо, нижня буде висунута вліво. Це вирішує проблему потоку.
Слідуючи цьому маршруту, ми можемо змінити провід і затвор, щоб вирішити обидві проблеми.
Збереження і FTF
Введемо дві нові універсальні цінності, і F . Ці два значення є універсальними; фактичні значення в сітці, такі як квадратні значення 2 і 3 (оскільки за умовою, ми зарезервували 1 як будівельний блок для стін) або будь-що, що ви вибрали. Вони представляють відповідно істинні та хибні.TF231
Примушуємо - резервуємо плитки , ( T , T ) , ( F , F ) наступним чином; ілюстрація нижче, опис зліва направо:(T,F)(T,T)(F,F)
- Ми використовуємо ту саму схему, що і форсування будь-якої плитки, використовуючи T як 1 ⋆ . Кожні 2 ⋆ та 3 ⋆ тут унікальні для цього гаджета.( 1 ⋆ , 1 ⋆ )Т1 ⋆2 ⋆3 ⋆
- Ми використовуємо ту саму схему, що і форсування будь-якої плитки, використовуючи F як 1 ⋆ Кожні 2 ⋆ і 3 ⋆ тут унікальні для цього гаджета.( 1 ⋆ , 1 ⋆ )Ж1 ⋆2⋆3 ⋆
- Ми використовуємо ту саму схему, що і примушування плитки , використовуючи F як 1 ⋆ в центрі, а T в інших місцях вгору. Це змушує ( F , T ) плитку. 2 ⋆ і 3 ⋆ здатні плитки з T , тому ми видаляємо їх із набору плиток. Кожні 2 ⋆ та 3 ⋆ тут унікальні для цього гаджета.( 1 ⋆ , 1 ⋆ )Ж1 ⋆Т( F, Т)2 ⋆3 ⋆Т2 ⋆3 ⋆
Дріт
Кожен провід починається і закінчується значенням, назвемо його , що є унікальним для проводів. Для кожного пункту, в якому бере участь провід, провід матиме два значення проводів, x ⋆ та x ′ ⋆ , які є унікальними для кожного проводів, і братимуть участь у тому самому пункті. Ілюстрація нижче, з описом зліва направо.А ⋆x ⋆х'⋆
- Провід, який бере участь в одному пункті. Дріт має висоту , і має довжину 2 * р + 3 , де р являє собою число статей дротові бере участь в. Дріт доповнюється два A ⋆ квадратами зліва і два справа. Він, звичайно, оточений стіною з усіх боків, позначеною синім контуром. Зверніть увагу, що 1 ⋆ є унікальним для даного проводу, і буде використовуватися тільки в проводі, і положення він бере участь в.22 ∗ p + 3pА ⋆1 ⋆
Нижче наведено два стану, описи зліва направо.
- Провід, який бере участь у одному пункті, у справжньому стані. Дріт вважається істинним, коли квадрати з T квадратами, а квадрати x ' спаряються з F квадратами. Вважається помилковим в іншому стані, де плитка обернена назад. Зверніть увагу на те, як плитка примусована після вибору плитки A ⋆ : ( T , F ) вже форсовано раніше, тому решта плитки повинна бути горизонтальною.x ⋆Тх'⋆ЖА ⋆( Т, F)
- Той самий провід у помилковому стані.
Беручи участь у більшій кількості пропозицій, є більше значення і x ′ ⋆ , одна пара для кожного пункту бере участь провід. Вони чергуються зверху і знизу, як і квадратів T і F, які розділяють кожен x ⋆ , x ′ ⋆ пара.x ⋆х'⋆ТЖx ⋆ , x'⋆
Два відповідних стани.
Цей гаджет закритий , тому немає проблеми з потоком.
Зверніть увагу, як в будь-якому стані ми збираємо наступні плитки, незалежно від стану: , ( A ⋆ , T ) , ( A ⋆ , F ) .( A ⋆ , A ⋆ )( А ⋆ , Т)( A ⋆ , F)
Однак є деякі плитки, в яких ми не впевнені; в одному стані можна видалити з набору плиток, тоді як в іншому стані ми можемо видалити ( 1 ⋆ , F ) , ( 1 ′ ⋆ , T ) , ( 2( 1 ⋆ , Т) , ( 1'⋆ , F) , ( 2 ⋆ , Т) , ( 2'⋆ , F) . . .з набору плиток, і яку плитку ми можемо фактично видалити? Відповідь: у воротах із пропозиціями є та сама проблема, але з протилежним набором плиток. Він завжди буде збирати залишилися, протилежні та необрані плитки, як ми побачимо в наступному розділі. Оскільки кожен із них поєднаний із воротами застережень, ми зможемо видалити їх обох.( 1 ⋆ , F) , ( 1'⋆ , Т),(2⋆,F),(2′⋆,T)...
Стаття
Далі ми створимо першу ітерацію нового ворота. Він складається з гаджета розміром , огородженого стінами. Всередині гаджета розміщуємо один F у верхньому центрі, а два T квадрата в нижніх кутах; один внизу зліва і один в нижньому правому. Решта квадратів будуть значеннями, що представляють провідні змінні трьох різних проводів. Назвемо ці ⋆ , б ⋆ , і з ⋆ . Р буде змушені паруватися з одним з дротяних змінних, а решта дроти-змінні будуть спаровуватися з Т значеннями. Ілюстрації нижче, описи зліва направо.2×3FTa⋆,b⋆,c⋆FT
- Зліва: конфігурація для першої ітерації нового перекладу.
- Право Три можливі стани плитки F
Ці три стани призводять до трьох можливих нахилів. Ілюстрація нижче, описи зліва направо.
- Вліво, вгорі : плитка ліворуч, Ліворуч, знизу: Плитка решти квадратів.Ж
- Середина, вгорі : плитка справа, Середня, знизу: Плитка решти квадратів.Ж
- Вправо, вгорі : плиткою вниз, Вправо, внизу: Плитка решти квадратів.Ж
Оскільки буде сполучений з однією з провідних змінних у пункті , ця провідна змінна вже не може бути сполучена з F у дроті ; таким чином змушуючи дріт до справжнього. І навпаки, решта змінних проводів, які плитки з T, будуть змушені плиткою з F в межах їх проводів. Це в точності те ж обмеження , як 1 -in- 3 - S Т п.ЖЖ ТЖ1 -в- 3 - S A T
Зверніть увагу, ⋆ , б ⋆ , і з ⋆ є дротові-змінні, але кожен з них може ставитися до х ⋆ або х ' ⋆ дроту змінної; використання x ′ ⋆ по суті є запереченням змінної дроту.a ⋆ , b ⋆ ,c ⋆x ⋆х'⋆х'⋆
Одне доповнення: щоб виконати зобов’язання знати, яку плитку можна зняти з набору плиток, ми повинні "подвоїти та протиставити" пункт. Що я маю в виду, щоб зробити ще гаджет, з 3 -х додаткових змінних , що представляють заперечень в ⋆ , б ⋆ , і з ⋆ . Назвемо ці ' ⋆ , б ' ⋆ , і з ' ⋆ . Це повинні бути заперечені значення змінних проводів a ⋆ , b ⋆3 × 23a ⋆ , b ⋆ ,c ⋆а'⋆ , б'⋆ ,c'⋆ і c ⋆ . Цейгаджет розміром 3 × 2 відрізняється тим, щоу центрівін буде мати T , ав кутахдвазначення F ; прямо протилежний досі описаному гаджету. "Подвоєння" цього пункту, ми знову додаємо ті самі обмеження, що й описаний вище гаджет. Однак ми також розрядимо всі комбінації ( T , x ⋆ ) , ( T , x ′ ⋆ ) , ( F , x ⋆ ) , ( F , xa ⋆ , b ⋆ ,c ⋆3 × 2ТЖ з мозаїчного набору, для кожної змінної (іотжедля ⋆ , б ⋆ ,і з ⋆ , а також, тому що воникінці кінців, дротові-змінні). Наведено нижче описи зліва направо.( Т, x ⋆ ) , ( T, х'⋆ ),( F, x ⋆ ) , ( F, х'⋆ )a ⋆ , b ⋆ ,c ⋆
- Застереження "подвійне та протилежне". Нижній розділ - описане вище положення; верхній розділ - це нещодавно описане протилежне застереження. Новий пункт має точно такі ж логічні обмеження; це протилежне нижнє застереження. Ці комбіновані пристосування та дріт розряджають усі комбінації з набору плиток, для кожну провідну змінну, що бере участь у пункті.( Т, x ⋆ ) , ( F, x ⋆ ) , ( T, х'⋆ ),( F, х'⋆ )
- Синя лінія посередині лівої частини фігури є для зручності перегляду; насправді його можна видалити, не допускаючи більше держав.
Отже, візьмемо приклад, щоб показати, що всі плитки скидаються так, як обіцяли. Ілюстрований нижче, опис зліва направо.
- Рисунок дроту, що бере участь в одному пункті; за умовою вибирається штат. Тут ми використовуємо , тоді як ⋆ і b ⋆ представляють інші значення проводів у цьому пункті.1 ⋆ = b ⋆a ⋆b ⋆
- Для даного стану в реченні, то значення змушені працювати в парі з сусіднім Т .1 ⋆Т
- Це призводить до того, що провід буде змушений істинно оцінюватися (ви можете сказати, як позитивна змінна дроту змушена спаровуватися з , а негативна змінна змушена спаровуватися з F , як пояснено вище).ТЖ
- Це змушує у контраспозитивному пункті (верхній розділ пункту) поєднуватися з T у пункті. Тепер якщо ви подивитеся на дріт, кожна плитка всередині дроту гарантовано буде розряджена: або розряджена в самому дроті, або у відповідному пункті-гаджеті. У такому стані маємо плитки, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 11'⋆Т( A ⋆ , A ⋆ )( А ⋆ , Т)( A ⋆ , F)( 1 ⋆ , Т) , ( 1 ' ⋆ , Р ) , і ( 1 ' ⋆ , Т ) .( 1 ⋆ , F)( 1'⋆ , F)( 1'⋆ , Т)
Спробуючи інший стан, ми отримуємо ілюстрацію нижче, опис зліва направо.
- Стаття знаходиться в іншому стані, плиткою одним із двох способів.( 1 ⋆ , Т
- Тому вимушений на дроті,( 1 ⋆ , F
- Провівши решту дроту відповідно до плитки та оцінюйте її як помилкову.
- І, нарешті, в контрапозиции / верхній частині п-гаджета, необхідно плитки, тому що ( 1 ' ⋆ , Т ) береться в проводі. У цьому стані маємо плитки, ( A ⋆ , A ⋆ ) , ( A ⋆ , T ) , ( A ⋆ , F ) , ( 1 ⋆ , T ) , ( 1 ⋆ , F( 1'⋆ , F)( 1'⋆ , Т)( A ⋆ , A ⋆ )( А ⋆ , Т)( A ⋆ , F)( 1 ⋆ , Т) , ( 1 ' ⋆ , Р ) , і ( 1 ' ⋆ , Т ) . Це ті самі плитки, які вивантажуються, як і в іншому стані.( 1 ⋆ , F)( 1'⋆ , F)( 1'⋆ , Т)
Таким чином, в будь-якому стані ми вивантажуємо однакові плитки. Таким чином, провід і пункт разом успішно виконують конкретні плитки, якщо є задовольняюче завдання.
Цей гаджет закритий , тому проблем із потоком не виникне.
Застереження-гаджет разом із дротяним гаджетом гарантовано завжди виконувати однакові значення плиткових пар , і, таким чином, ми можемо виконувати їх, навіть якщо ми не знаємо, яким способом він буде викладений.
Тепер усі наші гаджети відповідають критеріям.
Формулювання
У нашій остаточній постановці ми створюємо три ряди пристосувань, кожен розділений горизонтальною стінкою.
- У нижній частині розміщуємо пристосування-пристосування, які мають дві плитки заввишки. Нам потрібен примушуючи гаджет для будівельного блоку, а також для комбінацій і F . Ми розміщуємо пристосування для форсування безпосередньо поруч.ТЖ
- У середньому ряду розміщуємо дротяні пристосування, горизонтально, які мають дві плитки заввишки. Дротяні пристосування повинні бути відокремлені один від одного вертикальною стінкою.
- У верхньому ряду ми розміщуємо придатні фрази, які мають чотири плитки заввишки. Гаджети-пропозиції повинні бути відокремлені один від одного вертикальною стіною.
Наступні ілюстрації, описи над кожною фігурою. Клацніть зображення для повного дозволу. Вихідний код для відтворення / генерування зображень вказаний внизу сторінки.
Використовуючи формулу , маємо задовольняє рішення ( ¬ х 1 , х 2 , х 3 , ¬ х 4 )Φ ( x ) = ( x)1, ¬ х2, х3) ∧ ( x2, ¬ х3, х4) ∧ ( x1, х2, ¬ х4)( ¬ х1, х2, х3, ¬ х4) як свідок.
Спочатку ми починаємо з горизонтальних стінок, що розділяють ряди пристосувань. Ми показуємо квадрати і пари, які змушені плиткою в стінах.
Далі ми показуємо гаджети. Синій контур позначає межі гаджетів; пунктирний синій колір для пристосувань-пристосувань, оскільки вони не будуть оточені стінами. Зверніть увагу, що рядок посередині гаджета "clause" не оточений стіною; він є для зручності перегляду; Вилучення рядка не дозволяє більше станів у пункті, як було пояснено вище, але ми показуємо синю лінію для цієї демонстрації. Зауважте: ми використовуємо квадратні назви, щоб надати числам семантичну читабельність, коли це можливо. Кожне ім'я представляє числове значення.
Тут ми заповнюємо вертикальні стіни.
Тут ми заповнюємо рішення свідка; тобто це рішення плитки, якщо для його створення використовується рішення SAT.
Далі викладаємо площу наповнювача; решта дошки, настільки великі, як потрібно, на стільки, скільки потрібно, щоб плитка до цих пір. Таким чином, ми виводимо залишилися пари в плитковий набір. Тут пунктирні лінії являють собою дійсну, але не вимушену плитку; може бути інший спосіб їх укладання. Тут ми показуємо нижній лівий кут.н
Тут ми заповнюємо залишилися квадрати тривіальною дійсною плиткою.
Тут ми показуємо нижній правий кут сітки.
Тут ми показуємо верхній правий кут сітки. Зверніть увагу, як вертикальна плитка більше не підходить; тому верхній ряд обкладаємо горизонтально, якщо необхідно.
І нарешті верхній лівий кут.
Генерування всієї ігрової дошки одразу через TeX не вдається з помилками pdflatex, що не мають пам’яті, тому, якщо ви хочете її побачити, вам доведеться генерувати кліпи та скріплювати їх разом. Обов’язково перегляньте переглядач ноутбуків .
Джерела TikZ
Генератор ігор:
graphtex.py
Перетворює TeX у svg, використовуючи pdflatex, pdfcairo (poppler) та rsvg-convert (libsvg)
dominosa.py
Містить логіку перетворення, перевірку ігрових рішень та логіку малювання
dominosa_demo.py
Демонстраційна версія, яка генерує зображення, використані у відповіді вище. Збирає зображення в поточний робочий каталог.
dominosa_demo.ipynb
Демонстрація ipython, яка створює зображення, використані у відповіді вище.