Эй, это в пятницу днем, пусть будет решать головоломку/алгоритм проблемы.
Nonograms - это сетка с последовательностями чисел, определенными для каждой строки и столбца сетки. Числа определяют блоки "заполненных" квадратов для этой строки/столбца, но незаполненные области по обе стороны от блоков не определены. Например, если у вас есть строка, которая выглядит так:
и др.
"4 5" просто сообщает вам, что где-то в строке есть 4 последовательных блока, за которыми следуют 5 последовательных блоков, заполненных. Это будут только заполненные блоки, а объем пространства до/после них не определены.
Головоломка завершается, когда все строки и столбцы соответствуют их определениям без каких-либо противоречий.
Чрезвычайно простая игра в концепции, но для решения некоторых из них может потребоваться довольно много времени. Пазлы Picross DS постепенно увеличиваются в размере до 25х20 сеток, что обычно занимает около получаса, чтобы решить.
Однако мне всегда приходит в голову, что было бы довольно легкой игрой написать программу для решения. Я никогда не обходился, но, возможно, некоторые люди здесь будут наслаждаться этой проблемой. Если будет опубликовано достойное количество решений, я сравню их по большой головоломке друг против друга, подобно тому, как странице Nonogram Wikipedia о методах атаки головоломки, если вы хотите ссылаться на нее.
Здесь легко разобрать определение головоломки №1 от TylerK Picross, поэтому у вас есть что-то, что можно кормить программой. Строка 1 - это размеры головоломки (возможно, не нужны), строка 2 - это определения строк, строка 3 - определения столбцов. Это только первое, что приходило в голову, поэтому, если кто-то может подумать о более удобном исходном формате, не стесняйтесь комментировать или редактировать этот пост, чтобы включить его.
Ответ 5
Реальная проблема заключается в том, может ли кто-нибудь придумать алгоритм, который решает головоломку быстрее, чем человек? Это легко для относительно простых головоломок, таких как эталонный, но если головоломка растет, большинство алгоритмов здесь быстро замедлятся. Вот головоломка, которую я пытался решить. Проблема в том, что, например, у 4-й строки есть 2220075 возможных комбинаций. Если алгоритм Чарли временно примет неверную строку для строки 3, она будет проходить через все эти комбинации для строки 4. И это не означает, что алгоритм противоречит самому себе в строке 35 по ошибке, допущенной в строке 2.
Мой алгоритм был похож на Джона. Он не запускался в режиме x86 на моем 64-битном рабочем столе. Когда я переключил его на 64-битный режим и давал ему работать на ночь, мой компьютер был совершенно непригодным с утра. Этот процесс состоял в резервировании 8 гигабайт памяти (8 гигов на рабочем столе), и компьютер не реагировал из-за безумной замены. И он даже не решил все возможные строки. Не говоря уже о том, что он даже не коснулся возможных комбинаций столбцов.
List<List<int>> rows =
new List<List<int>>()
{
new List<int> { 8,29,4 },
new List<int> { 6,4,25,4,3 },
new List<int> { 5,3,2,3,9,4,2,1,3 },
new List<int> { 4,2,2,2,2,1,2,2 },
new List<int> { 4,1,1,9,10,2,2,1 },
new List<int> { 3,2,6,5,5,1,1 },
new List<int> { 3,1,5,5,1,1 },
new List<int> { 3,1,4,4,1,1 },
new List<int> { 3,1,4,4,1,1 },
new List<int> { 3,1,3,3,1,1 },
new List<int> { 3,1,3,6,2 },
new List<int> { 3,1,2,3,2,4,2 },
new List<int> { 4,3,1,8,7,1,2,3 },
new List<int> { 4,2,1,12,11,1,2,4 },
new List<int> { 5,1,2,7,2,2,6,1,1,4 },
new List<int> { 4,1,1,1,6,2,2,6,1,2,1,3 },
new List<int> { 4,1,1,2,4,3,4,3,1,1,1,1,3 },
new List<int> { 4,1,1,2,1,4,1,2,3,2,1,2,2 },
new List<int> { 3,1,1,1,2,5,6,1,1,1,3,2 },
new List<int> { 3,2,1,1,2,1,5,4,4,2,1,2,1,2 },
new List<int> { 3,2,2,1,1,4,2,2,3,1,1,2,1,1,2 },
new List<int> { 3,1,3,2,1,1,4,1,5,3,2,1,3,1,2 },
new List<int> { 3,1,2,1,2,1,3,7,4,1,4,2,2 },
new List<int> { 2,1,4,1,1,1,2,6,2,2,2,3,2,1 },
new List<int> { 2,2,4,1,2,1,2,5,2,1,1,3,2,1 },
new List<int> { 2,2,1,4,1,1,3,3,2,1,4,4,1 },
new List<int> { 2,3,3,2,1,3,3,7,4,1 },
new List<int> { 2,3,2,4,5,8,1,2,1 },
new List<int> { 1,1,3,11,6,7,1,3,1 },
new List<int> { 1,1,2,2,13,10,2,3,2 },
new List<int> { 1,2,3,1,6,1,1,7,1,5,2 },
new List<int> { 1,1,3,2,6,1,1,1,1,4,1,4,2 },
new List<int> { 1,1,6,7,2,4,2,5,6,1 },
new List<int> { 1,1,2,3,1,4,2,2,11,2,1 },
new List<int> { 1,1,1,1,2,1,5,10,1,1,1 },
new List<int> { 1,1,1,1,4,7,4,10,1,1,1 },
new List<int> { 1,2,1,1,28,1,1,3 },
new List<int> { 1,2,1,2,27,2,1,3 },
new List<int> { 1,1,1,1,26,1,1,1,1 },
new List<int> { 2,3,1,28,2,1,2,1 }
};
List<List<int>> cols =
new List<List<int>>()
{
new List<int> { 40 },
new List<int> { 28,1 },
new List<int> { 23,8 },
new List<int> { 5,6,7,4 },
new List<int> { 3,6,1,9,3,1 },
new List<int> { 2,3,2,5,4,2,2 },
new List<int> { 1,2,4,1,2,5,2 },
new List<int> { 1,1,4,9,2,3,2 },
new List<int> { 2,4,2,6,1,4,3 },
new List<int> { 1,4,1,3,4,1,6 },
new List<int> { 1,4,3,2,3,5,5 },
new List<int> { 2,4,1,2,3,4,1,3 },
new List<int> { 1,2,3,4,2,2,4,4,1 },
new List<int> { 1,1,2,3,2,1,4,2,4 },
new List<int> { 2,3,5,3,3,5,4 },
new List<int> { 3,1,6,1,2,5,5 },
new List<int> { 3,2,6,2,15 },
new List<int> { 3,1,8,2,13 },
new List<int> { 2,2,4,5,15 },
new List<int> { 2,2,2,2,22 },
new List<int> { 2,1,1,1,12,6 },
new List<int> { 2,1,10,4,5 },
new List<int> { 3,1,3,1,2,4 },
new List<int> { 3,1,1,4,3,1,4 },
new List<int> { 3,2,2,3,2,2,5 },
new List<int> { 3,1,1,5,1,1,5 },
new List<int> { 3,1,1,5,1,1,5 },
new List<int> { 3,1,1,5,1,1,5 },
new List<int> { 3,2,5,2,1,1,4 },
new List<int> { 3,1,1,3,2,2,4 },
new List<int> { 3,1,6,4,5 },
new List<int> { 2,2,12,2,6 },
new List<int> { 2,2,1,1,22 },
new List<int> { 2,1,2,2,5,15 },
new List<int> { 3,1,4,3,2,14 },
new List<int> { 3,1,7,2,1,13 },
new List<int> { 3,2,6,1,1,6,8 },
new List<int> { 3,2,5,2,2,4,7 },
new List<int> { 2,1,2,4,1,1,1,4,1,4,2 },
new List<int> { 1,1,4,4,3,1,4,5,1 },
new List<int> { 1,1,5,1,1,2,1,2,2,3,2 },
new List<int> { 1,5,2,2,1,5,5,3 },
new List<int> { 1,6,2,1,4,2,6,1 },
new List<int> { 1,6,2,6,5,2 },
new List<int> { 1,5,3,1,9,2 },
new List<int> { 2,2,4,2,6,3 },
new List<int> { 1,2,2,2,9,2,1 },
new List<int> { 3,5,5,8,4 },
new List<int> { 4,13,9 },
new List<int> { 27,2 }
};
Авторское право принадлежит Гильдии информационных технологий Тампере/Kaisapais/Финский пивоваренный завод.