Решение головоломок Какуро - PullRequest
8 голосов
/ 30 октября 2010

Вот хороший пример для размышления:

http://en.wikipedia.org/wiki/Kakuro

Я пытаюсь сделать решатель для этой игры. Делопроизводство завершено (чтение исходного файла с переменным числом столбцов и строк. Предполагается, что входной файл соответствует правилам игры, поэтому игра всегда решаема. Не торопитесь, чтобы прочитать правила игры.

Я позаботился о структуре данных, которая, я думаю, подойдет лучше всего:

struct aSquare { int verticalSum; int horizontalSum; int value; }

И сделал «массив» из них динамически для работы. Я сделал так, чтобы черные квадраты имели значение -1, а белые квадраты (фактические квадраты решения) инициализировались в 0. Вы также можете легко получить положение каждой структуры aSquare из массива, не нужно создавать для нее дополнительные поля структуры .

Теперь алгоритм ... Как в мире я примирю все эти суммы и найду общий способ, который решит все типы сеток. Я боролся с этим весь день безрезультатно.

Помощь приветствуется, веселитесь!

* РЕДАКТИРОВАТЬ: я только что понял, что фактическая ссылка, которую я разместил, содержит несколько советов относительно методов решения. Я все еще буду следить за тем, что придут люди.

Ответы [ 6 ]

6 голосов
/ 30 октября 2010

Относительно программирования ограничений: Вот несколько различных реализаций, как решить головоломку Какуро с помощью программирования ограничений (все используют один и тот же базовый принцип).Проблема устранена в программе.

Редактировать: Добавлено Google or-tools / C # и Программирование набора ответов.

5 голосов
/ 30 октября 2010

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

def solve(kakuro):
    if kakuro has no empty fields:
        print kakuro
        stop.
    else:
        position = pick a position
        values = [calculate possible legal values for that field]
        for value in values:
            kakuro[position] = value
            solve(kakuro)
        kakuro[position] = None # unset after trying all possibilities

Этот алгоритм может работать лучше, если вы найдете наилучший порядок заполнения полей. Попробуйте выбрать поля, которые будут наиболее ограничены (как, например: допустимых значений не так много).

В любом случае, это, вероятно, будет проще всего реализовать, поэтому попробуйте и ищите более сложные решатели, только если этот не будет работать. (На самом деле это один из простейших решателей программирования с ограничениями; реальные решатели CP, конечно, намного сложнее).

2 голосов
/ 30 октября 2010

Если в конечном итоге вы заинтересованы в создании программного решения для этих игр, но не вдаваетесь в алгоритмические детали, я рекомендую использовать механизм программирования с ограничениями (CP).CP - это парадигма декларативного программирования, которая очень хорошо подходит для такого рода проблем.Доступны несколько коммерческих и общедоступных движков CP.

http://en.wikipedia.org/wiki/Constraint_programming

1 голос
/ 30 октября 2010

Я бы предположил, что Линейное программирование может быть легко использовано для решения этой игры ... тогда это целочисленная задача, для которой существуют точные решения .. ( ветвь и граница ? плоскость резания ?)

В любом случае использование таблицы с наиболее определенными комбинациями наверняка будет полезно (например, http://www.enigmoteka.com/Kakuro%20Cheatsheet.pdf)

0 голосов
/ 30 октября 2010

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

0 голосов
/ 30 октября 2010

Это прямолинейная линейная алгебра, для решения которой используются векторные / матричные методы.

[править - отвечая на комментарии]

a + b + 0 + d + 0  = n1
0 + b + c + 0 + e  = n2
a + 0 + c + 0 + 0  = n3
a + b + c + 0 + e  = n4
a + 0 + c + d + 0  = n5

Выше преобразуется в матрицу, и, сложив и вычтя кратные строки, вы получите:

a 0 0 0 0 na
0 b 0 0 0 nb
0 0 c 0 0 nc
0 0 0 d 0 nd
0 0 0 0 e ne

Нет комбинаторики, все остаются целыми числами.

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