Фон
Нонограма , також відома як Picross або Griddlers, - це головоломка, де мета - визначити, чи повинна кожна клітинка в 2D сітці бути кольоровою або залишена порожньою, використовуючи кількість послідовних кольорових комірок у кожному рядку.
Далі наводиться приклад головоломки з розв'язкою.
Проблема полягає в тому, що деякі комерційні ігри з програмою Nonogram / мобільні додатки мають головоломки, які не вирішуються вручну (наприклад, мають кілька рішень або потребують глибокого зворотного відстеження). Однак вони також пропонують гравцю життя, де втрачається одне життя, коли ви намагаєтеся розфарбувати клітинку, правильна відповідь якої порожня . Отож, настав час жорстоко змусити ці неприємні "пазли"!
Щоб спростити завдання, уявіть лише один рядок з його підказкою і більше нічого:
3 7 | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Це [3,7]
підказки, а довжина лінії - 15 комірок. Оскільки в ньому є кілька можливих рішень, нам потрібно ризикувати деяким життям, щоб повністю вирішити цю лінію (тобто визначити всі кольорові клітини).
Виклик
З огляду на рядок із підказками (список натуральних чисел) та довжину рядка, знайдіть максимальну кількість життів, які ви втратите, припускаючи, що ви жорстоко форсуєте лінію з оптимальною стратегією.
Зауважте, що ви завжди здогадуєтесь кольоровими клітинками . У реальних іграх відгадування порожніх комірок (правильних чи неправильних) не впливає на ваше життя, тому ви не можете "вирішити" пазл таким чином.
Крім того, ви можете припустити, що вхід завжди представляє дійсну лінію Nonogram, тому вам не потрібно турбуватися про щось подібне [6], 5
.
Пояснення
Розглянемо спочатку кілька простіших прикладів.
[1,2], 5
Для цього рядка є рівно три можливості ( O
це кольорова клітинка, .
порожня):
O . O O .
O . . O O
. O . O O
Якщо ми спробуємо розфарбувати комірку 0 (індекс на основі 0 зліва), трапиться одне з наступних:
- Клітина правильно забарвлена. Зараз у нас є дві можливості, і ми можемо вибрати між коміркою 2 та коміркою 4, щоб повністю вирішити рядок. У будь-якому випадку ми втратимо одне життя в гіршому випадку.
- Клітина порожня, і ми втрачаємо життя. У цьому випадку ми вже визначили унікальне рішення цієї лінії, тому ми закінчилися з 1 втраченим життям.
Тому відповідь на [1,2], 5
це - 1.
[5], 10
Двійковий пошук? Ні.
Найбільш очевидний перший вибір - це 4 або 5, що відкриє одну можливість, якщо вона порожня (ціною 1 життя). Скажімо, ми вибрали 4 спочатку. Якщо клітинка 4 справді кольорова, ми продовжуємо її зліва, тобто намагаємося 3, 2, 1 і 0, поки життя не втратиться (або клітина 0 не буде кольорова, тоді ми взагалі не витрачаємо життя). Щоразу, коли життя втрачається, ми можемо однозначно визначити рішення, наприклад, якщо ми побачимо щось подібне:
_ _ X O O _ _ _ _ _
тоді ми вже знаємо, відповідь така:
. . . O O O O O . .
Тому відповідь [5], 10
також - 1.
[3,7], 15
Почніть з клітини 11, яка, якщо вона порожня, одразу відкриє наступне рішення.
O O O . O O O O O O O X . . .
Потім спробуйте 12, що, якщо порожнє, дає дві можливості, які можна вирішити ціною 1 додаткового життя.
O O O . . O O O O O O O X . .
. O O O . O O O O O O O X . .
Тепер спробуйте 2. Якщо порожній, це призводить до трьох можливостей, які можна вирішити аналогічно [1,2], 5
прикладу.
. . X O O O . O O O O O O O .
. . X O O O . . O O O O O O O
. . X . O O O . O O O O O O O
Якщо таким чином мінімізувати ризик, ви можете досягти будь-якого рішення з макс. Прожито 2 життя.
Випробування
[1,2] 5 => 1
[2] 5 => 2
[1] 5 => 4
[] 5 => 0
[5] 10 => 1
[2,1,5] 10 => 0
[2,4] 10 => 2
[6] 15 => 2
[5] 15 => 2
[4] 15 => 3
[3,7] 15 => 2
[3,4] 15 => 3
[2,2,4] 15 => 4
[1,1,1,1,1,1,1] 15 => 2
[2,1,1,3,1] 15 => 3
[1,1,1,2,1] 15 => 5
Для останніх двох випадків оптимальною стратегією є не проходження мінімальних заготовок, а просто перехід зліва направо (або справа наліво). Дякуємо @crashoz, що вказав на це.
Правила
Діють стандартні правила гольф-коду . Виграє найкоротше дійсне подання в байтах.
Баунті
Якщо хтось придумає поліноміально-часовий алгоритм (з підтвердженням правильності), я присуджую +100 щедрості за таке рішення.
[6], 5
?