Решение пасьянса FreeCell

Наблюдение 1. Если в позиции для всех карт выполняется условие: младшая карта не лежит под старшей, то такая позиция собирается на базовые карты без дополнительных перекладок.

Наблюдение 2. Пока для каких-то карт в позиции выполняется условие: имеется базовая карта той же масти достоинством -1, и достоинство карты не больше минимального достоинства +1 базовых карт противоположного цвета, эти карты можно перемещать на базовые.

Наблюдение 3. Любой свободный туз всегда перекладывается в базу на свободное место.

Наблюдение, не относящееся к делу. В FreeCell можно задать в Select Game номера игр от -1 до -4 включительно. Получаются интересные раскладки.

Предлагаю внутреннее представление карт числами:
1. Старшинство 1=«A»или«Т» , 2=«2»...12=«Q»или«Д», 13=«К» он и есть «К».
2. Масти от 1 до 4, с чередованием: red, black.

Ячейки:
1. Базовые H — «Home».
2. Временные M — «Memory», A, B, C, D
3. Колонки C — «Columns», 1-8.

Внутренние команды:
Откуда и куда.
Куда — обозначаем одним знаком: H, M, 1-8. Программа сама определяет куда именно, согласно правилам игры.
Откуда — A, B, C, D. 1-8 если верхнюю карту (именно верхнюю, предлагаю колонки сделать стеком, с дополнительными возможностями). Если карта не с вершины, то колонка и номер в стеке + С: 28C(2я колонка,8я карта с низу), 211C-(при выполнении условия...) или 21C, что можно просто 2.
Полные команды: 87, 310C1, B2...

Масть проверяем чет, не чет. .В «Columns» чет ложится на нечет и наоборот. В «Home» на себе подобную. Хотя можно просто вычитать верхнюю масть из нижней или наоборот и проверять результат на равенство определенным значениям, опять же в зависимости куда хотим положить в «H» или «C» и получаем на выходе возможность хода. А еще перекладка части стека...

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.