Игры пятнашки

Содержание

История появления игры

Авторство игры принадлежит Ною Палмеру Чепмэну. Еще в далеком 1874 году Ной показывал свою игру знакомым, которая включала в себя квадратную коробку, сторона которой равна 4 сторонам костяшки, в свою очередь костяшек 15 одинаковых квадратных штук. В коробке остается 1 свободное место под одну костяшку. Однако, целью игры было перемещение костей так, чтобы в каждом ряду была сумма 34.

Особое внимание было к игру с 1880. Именно в этом году некто Чарльз Певи, установил денежное вознаграждение за решение данной задачи

Популярность игры мгновенно выросла. С тех пор правила поменялись и теперь они такие, как описаны выше.Существуют различные варианты игры c разными размерами:

Алгоритм «Как собрать пятнашки»?

Как-то раз, собирая пятнашки, заметил, что чем меньше поле ячеек в игре пятнашки, тем проще их собрать. Получается, что проще всего собрать пятнашки размером 3х3 ячейки, чем например, пятнашки размером 4х4.

Пятнашки размером 3х3 элемента собираются очень легко, особенно если отсортировать все костяшки по порядку вокруг поля:

Для этого нужно перемещать самую первую костяшку по кругу против часовой стрелки, и при первой же возможности поставить следом за первой костяшкой, вторую, потом третью, собрав, таким образом, паровозик из костяшек от первой до последней.

Главное, чтобы последние две костяшки, в данном случае 7 и 8 стояли наоборот, то есть. паровозик из цифр должен выглядеть так: 1 2 3 4 5 6 8 7. Если мы поделим этот паровозик на строки, то как раз и получим собранные пятнашки.

Посмотрите еще раз на картинку выше, там костяшки 1 2 3 уже стоят на своем месте, осталось всего-то переместить костяшки 4 5 6 на второй ряд. В результате этого переноса костяшки 7 и 8 уже будут стоять в третьем ряду в нужном порядке.

Разделяй и властвуй

Это очень простой способ сбора пятнашек, однако, собрать таким способом пятнашки размером 4х4 ячейки уже намного сложнее, не говоря уже о пятнашках бОльшего размера.Если приосмотреться к этой игре внимательно, то можно увидеть, что ничего сложного нет, если разделить поле 4х4 ячейки на 3 части и собрать эти 3 части по отдельности.

Часть первая, костяшки 1 2 3 4

В первую очередь лучше собрать костяшки 1 2 3 4 и расположить их на своем месте, после чего просто “забыть” про них, будто их нет:

После того как мы про них “забыли”, дальше остается собрать пятнашки с размером поля уже 4х3, вместо 4х4.

Теперь нам нужно собрать костяшки 5 9 13 в паровозик и поставить их сбоку слева.

Часть третья, оставшиеся костяшки

Теперь, когда мы уже поставили костяшки 1 2 3 4 и 5 9 13 на свои места, рабочее поле уменьшилось до размеров 3х3, и осталось только собрать пятнашки размером 3х3:

Единственное отличие заключается только в номерах костяшек, которые нужно отсортировать так же по возрастанию, поменяв последние две костяшки наоборот, чтобы получился паровозик: 6 7 8 10 11 12 15 14, который так же разделится на 3 ряда:

Проблема может быть только в том, что костяшки могут встать не по порядку. Вместо паровозика из цифр 6 7 8 10 11 12 15 14 может получиться последовательность 6 7 8 10 11 12 14 15. В таком случае нужно будет постараться поменять эти костяшки местами. Зачастую для этого приходится ломать уже построенные костяшки 5 9 13 или 1 2 3 4, но зато они потом так же быстро выстраиваются снова.

Обработка нажатия кнопки мыши

Когда пользователь нажимает левой кнопкой мыши (сокр. «ЛКМ») на каком-либо блоке игрового поля с целью переставить его на пустое место, то мы должны отловить данное событие, а затем проверить, находится ли рядом с этим блоком пустая клетка и если действительно такая клетка присутствует, то нужно задать направление перестановки (через переменные и ).

Ниже представлен код обработчика события щелчка ЛКМ и проверки на присутствие рядом пустой клетки:

// Пользователь нажал на «крестик» и хочет закрыть окно?
if (event.type == Event::Closed)
// тогда закрываем его
window.close();

// Пользователь щелкнул мышкой?
if (event.type == Event::MouseButtonPressed)
{
// Если это была ЛКМ, то пробуем выполнить перестановку «пятнашек»
if (event.key.code == Mouse::Left)
{
// Получаем координаты того места, где был произведен щелчок
Vector2i position = Mouse::getPosition(window);

// Переводим эти координаты в координаты наших блоков
int x = position.x / blockWidht + 1;
int y = position.y / blockWidht + 1;

// Переменные для задания смещения…
int dx = 0; // …горизонтального…
int dy = 0; // …и вертикального.

// Если справа пустое место
if (grid == 16) { dx = 1; dy = 0; };

// Если снизу пустое место
if (grid == 16) { dx = 0; dy = 1; };

// Если сверху пустое место
if (grid == 16) { dx = 0; dy = -1; };

// Если слева пустое место
if (grid == 16) { dx = -1; dy = 0; };
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

// Пользователь нажал на «крестик» и хочет закрыть окно?

if(event.type==Event::Closed)

// тогда закрываем его

window.close();

// Пользователь щелкнул мышкой?

if(event.type==Event::MouseButtonPressed)

{

// Если это была ЛКМ, то пробуем выполнить перестановку «пятнашек»

if(event.key.code==Mouse::Left)

{

// Получаем координаты того места, где был произведен щелчок

Vector2i position=Mouse::getPosition(window);

// Переводим эти координаты в координаты наших блоков

intx=position.xblockWidht+1;

inty=position.yblockWidht+1;

// Переменные для задания смещения…

intdx=;// …горизонтального…

intdy=;// …и вертикального.

// Если справа пустое место

if(gridx+1y==16){dx=1;dy=;};

// Если снизу пустое место

if(gridxy+1==16){dx=;dy=1;};

// Если сверху пустое место

if(gridxy-1==16){dx=;dy=-1;};

// Если слева пустое место

if(gridx-1y==16){dx=-1;dy=;};

}

}

Также добавим механизм перестановки двух блоков. Алгоритм данной операции предельно простой — это обмен значениями двух переменных с использованием третьей переменной, в которой сохраняется промежуточный результат:

// Если слева пустое место,
if (grid == 16) { dx = -1; dy = 0; };

// то меняем местами пустую клетку с выбранным блоком
int temp = grid;
grid = 16;
grid = temp;
}

}

// тогда закрываем его
window.close();

1
2
3
4
5
6
7
8
9
10
11
12
13

// Если слева пустое место,

if(gridx-1y==16){dx=-1;dy=;};

// то меняем местами пустую клетку с выбранным блоком

inttemp=gridxy;

gridxy=16;

gridx+dxy+dy=temp;

}

 
}
 
// тогда закрываем его

window.close();

Снова компилируем, запускаем нашу программу и видим уже следующее:

Математическое описание [ править | править код ]

Можно показать, что ровно половину из всех возможных 20 922 789 888 000 (=16!) начальных положений пятнашек невозможно привести к собранному виду: пусть квадратик с числом i <displaystyle i> расположен до (если считать слева направо и сверху вниз) k <displaystyle k> квадратиков с числами меньшими i <displaystyle i> . Будем считать n i = k <displaystyle n_=k> , то есть если после костяшки с i <displaystyle i> -м числом нет чисел, меньших i <displaystyle i> , то k = 0 <displaystyle k=0> . Также введем число e <displaystyle e> — номер ряда пустой клетки (считая с 1). Если сумма

является нечётной, то решения головоломки не существует .

Если допустить поворот коробки на 90 градусов, при котором изображения цифр окажутся лежащими на боку, то можно перевести неразрешимые комбинации в разрешимые (и наоборот). Таким образом, если вместо цифр на костяшки нанести точки и не фиксировать положение коробки, то неразрешимых комбинаций вообще не окажется.

ДРУГОЕ

Как собрать мойку?

Как собрать мойку?При проведении ремонтных работ на кухне многие сталкиваются с вопросом, как собрать мойку. Сделать…

Как собрать уголок?

Как собрать уголок?Если вы любите экспериментировать и не любите шаблонные изделия, то можно задуматься над тем, как…

Как собрать сэндвич?

Как собрать сэндвич?Чтобы правильно собрать сэндвич, необходимо учитывать ряд важных нюансов, которые представлены в…

Как собрать антенну?Когда говорят о спутниковой тарелке, обычно сразу представляют ее «зеркало» — это и…

Как собрать межкомнатную дверь?

Как собрать межкомнатную дверь?В процессе ремонта может возникнуть желание поставить новую межкомнатную дверь. Но для…

Как собрать щит?

Как собрать щит?Если в доме были полностью завершены все электромонтажные работы, завершающим этапом будет установка…

Как собрать панели?Современные строительные материалы позволяют делать ремонт быстро и красиво. Одним из таких…

Как собрать кран?

Как собрать кран?Многие люди всю жизнь наблюдают за строительством зданий, но не знают, как собирается такая махина,…

Как собрать торт?

Как собрать торт?Неотъемлемым атрибутом любого праздничного стола является торт. Для большой компании отлично подойдет…

Как собрать танк?

Как собрать танк?Моделирование является не просто детской забавой — это весьма увлекательное хобби. Военная техника в…

Как собрать оригами?Все мамы хотят, чтобы их малыш вырос здоровым, красивым, умным и успешным. Поэтому они столько…

Как выиграть золото в аватарии?

Аватария — красочная игра, которая предоставляет вам большие возможности, в том числе касающиеся и выбора одежды для…

Как сделать в Minecraft самолёт?Многие игроки посмотрели в Minecraft видео, самолёт там получается очень…

Как быстро собрать кубик Рубика?Одной из самых популярных головоломок является кубик Рубика. Далеко не все могут…

Как собирать головоломку?

Как собирать головоломку?Очень часто мы забываем, что нам необходимо не только физическое развитие и поддержание нашего…

Как собрать кольцо?

Как собрать кольцо?Многие люди любят сложные и интересные головоломки, которые заставят поднапрячься, чтобы ее решить.…

Как собрать кубик рубика 2х2?

Как собрать кубик рубика 2х2?Кубик Рубика 2х2 называют мини-версией известной головоломки. Собрать его проще, чем кубик…

Как собрать крест в кубике рубике?

В детстве одна из самых известных головоломок являлась кубическая фигура с разноцветными ячейками. Собрать кубик рубика…

Как собрать кубик рубика 4х4?

Головоломки являются отличным способом улучшить и развить зрительную и тактильную память. Кроме этого они помогают…

Как собрать пирамиду?

Самой распространенной интеллектуальной игрой на сегодняшний день является кубик Рубика. Ежегодно разрабатываются все…

Как собрать шар?

Как собрать шар?Если вы любите головоломки различного рода, то вас должна заинтересовать информация, как собрать шар из…

Вариации правил игры в «Пятнашки»

За время существования данного спортивного развлечения придумана масса различных вариаций игры. Основные правила те же, отличия в деталях. Вот несколько из них:

  1. Если пятнашка догоняет кого-то, а ему пересек путь кто-то из убегающих, тогда следует погнаться за ним.
  2. Запятнать водящий может только кого-то в процессе бега, а чтобы быть в безопасности можно присесть.
  3. Играющий если хочет спастись должен подбежать к дереву, стать около него и обнять.
  4. Пятнашка не может пятнать того играющего, который в опасный момент взял за руку еще одного игрока.
  5. Если игрок стал на одну ногу, а другу согнул назад и держит, значит, его запятнать нельзя.

  1. Все игроки, кроме водящего, за поясом держат по ленте. Когда пятнашка догоняет кого-либо из игроков, его целью является выхватить ленту и спрятать себе за пояс, тогда пятнашкой становится игрок без ленточки.
  2. Два игрока держат скакалку за разные концы и убегают вдвоем, а когда пятнашка кого-то запятнает, тот его должен сменить.
  3. Можно играть и с мячом. Пятнашка должен попасть мячом в одного из играющих. Соответственно тот, в кого попали, будет новым водящим. Но если мяч не попал ни в кого, другие играющие могут его забрать и кидать друг другу. В таком случае, пятнашка должен либо отобрать мяч, либо запятнать кого-то в момент, когда мяч в руках.
  4. Площадка делится на несколько участков. Можно на два, три либо четыре. И на каждом участке должен быть свой водящий, причем следует сделать ему отличительные символы. Другие игроки могут бегать по всему участку. На каждом участке можно нарисовать круг, что означает дом безопасности или отдыха для тех, кто устал много бегать. Играющий, до которого дотронулся пятнашка, должен стать водящим на участке, где его запятнали. 
  5. Когда игроков не так много, можно попробовать поиграть так. Одного играющего выбрать пастухом, двух – волками и четыре или пять – овечками. Пастух победит, когда поймает волков, а волки когда догонят всех овец.

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

История возникновения игры

На первый взгляд простая головоломка имеет богатую историю, которая берет начало в далеком тысяча восемьсот семьдесят четвертом году. Ее создателем был американец Ной Палмер Чепмэн. Обыкновенный почтмейстер, проживавший в небольшом городке штата Нью-Йорк, придумал головоломку, состоящую из шестнадцати номерков-квадратиков. Все квадратики необходимо было выстроить по четыре в ряд.

При этом сумма чисел в каждом из них должна была равняться тридцати четырем. Сын почтмейстера Фрэнк Чепмэн усовершенствовал игру и изменил ее правила. Головоломка довольно быстро приобрела популярность по всему миру, сохранив ее до наших дней.

Использование пятнашек в информатике [ править | править код ]

«Пятнашки» разных размеров с 1960-х годов регулярно используются в исследованиях в области ИИ; в частности, на них испытываются и сравниваются алгоритмы поиска в пространстве состояний с разными эвристическими функциями и другими оптимизациями, влияющими на число посещённых в процессе поиска конфигураций головоломки (вершин графа). В исследованиях так или иначе использовались головоломки размеров 3 × 3 , 4 × 4 , 5 × 5 , 6 × 6 , 2 × 7 , 3 × 5 .

Можно перечислить основные причины выбора пятнашек в качестве «испытательного стенда» для алгоритмов поиска :

  1. пространство состояний классических пятнашек является доступным для анализа, но всё же достаточно большим, чтобы представлять интерес и использовать и сравнивать разнообразные эвристики ;
  2. не известен ни один алгоритм, находящий кратчайшее решение для обобщённых пятнашек n × n за разумное время ;
  3. сама задача поиска кратчайшего решения для пятнашек проста для понимания и программного манипулирования ; головоломка поддаётся описанию с помощью небольшого и чётко определённого набора простых правил ;
  4. для моделирования головоломки не требуется передачи семантических тонкостей, присущих более сложным предметным областям ;
  5. задачи с пятнашками — удачные представители класса проблем, в которых требуется найти кратчайший путь между двумя заданными вершинами неориентированного конечного графа ;
  6. размер графа поиска зависит от размера головоломки n экспоненциально, хотя любое состояние можно описать с затратой O ( n 2 ) памяти ;
  7. одна и та же эвристическая функция может применяться ко всем состояниям, так как все состояния описываются одинаково; в реальных применениях разные состояния могут иметь разные описания, что требует введения нескольких эвристик ;
  8. использование в исследованиях игр и головоломок не порождает финансовых или этических проблем .

Эвристический поиск

В качестве алгоритма поиска может использоваться алгоритм A*, > , поиск в ширину.

Головоломка 3 × 3 легко решается любым алгоритмом поиска. Произвольные конфигурации пятнашек 4 × 4 решаются с помощью современных алгоритмов поиска за несколько миллисекунд . Для оптимального решения головоломки 5 × 5 требуются больши́е затраты ресурсов даже с применением современных компьютеров и алгоритмов ; процесс поиска может длиться несколько недель и генерировать триллионы узлов . Оптимальное решение произвольных конфигураций головоломки 6 × 6 до сих пор находится за пределами возможностей , в связи с чем в исследованиях делаются лишь попытки предсказать относительную производительность алгоритма > .

Одна из самых простых эвристик для пятнашек может быть выражена следующим образом :

Число ходов, требуемых для решения, не меньше, чем число плиток, находящихся не на своих местах.

Верность утверждения, то есть допустимость эвристической функции «число плиток, находящихся не на своих местах», следует из того, что за один ход может быть поставлена на место только одна плитка

Эта эвристика не использует всю имеющуюся информацию: например, она не принимает во внимание расстояния, на которые должны быть перемещены отдельные плитки

Более «умная» эвристика сопоставляет каждому расположению плиток сумму расстояний от текущей позиции каждой плитки до её целевой позиции . В литературе эта эвристика встречается под именем «манхэттенское расстояние» (Manhattan distance) . Допустимость функции следует из того, что за один ход перемещается только одна фишка, и расстояние между этой фишкой и её конечной позицией изменяется на 1. Тем не менее, эта эвристика также не использует всю имеющуюся информацию, из-за того, что в одной позиции не могут находиться одновременно две плитки. Существуют более информированные варианты «манхэттенского расстояния», такие, как Linear Conflict .

Для быстрого поиска оптимального решения головоломки 4 × 4, а также для возможности находить оптимальное решение головоломки 5 × 5 в разумные сроки, разработаны эвристики, основанные на базах данных образцов (pattern databases) . Подобные эвристики являются по сути заранее вычисленными и хранящимися в оперативной памяти таблицами, в которых закодированы оптимальные решения для подзадач; каждая из подзадач сводится к перемещению в целевые позиции определённой группы плиток . Эти эвристики также могут быть применены к кубику Рубика и другим головоломкам .

Пятнашки – известная всему миру головоломка. Игроку доступно поле размером 4×4, состоящее из 16 клеток. Все клетки кроме одной заняты костяшками с номерами от 1 до 15, которые перемешаны между собой. Цель игры – упорядочить костяшки по порядку используя свободное поле.

Сбор пятнашек

  1. Мы начинаем собирать пятнашки с верхнего левого угла, переместив туда фишку с номером 1 и далее 2, 3 и 4 последовательно заполняем весь верхний ряд заканчивая правым углом. Или выстраиваем фишки одну за другой, и уже потом «задвигаем» ряд на свое место.
  2. Далее аналогично заполняем второй ряд начиная с 5 слева и заканчивая 8 справа.
  3. Далее самым распространенным вариантом, будет поставить на свои места фишки под номерами 9 и 13.
  4. А теперь подходим к самому интересному и выстраиваем последние фишки. Прокручивая их вправо-влево составляем одну за другой так, чтобы все они последовательно встали на свои места. Здесь есть интересный способ, поставить последнюю фишку в предпоследнюю позицию и уже после этого предпоследней фишкой сдвинуть последнюю.

Другие статьи про решение головоломок и логических игр вы можете посмотреть в разделе Логические задачи и головоломки.

Внимание, только СЕГОДНЯ!

Задачи [ править | править код ]

The Gem Puzzle

В головоломке The Gem Puzzle, которую в 1879 году производил и продавал Матиас Райс, игрок высыпал плитки из коробочки и случайным образом укладывал их обратно, после чего пытался восстановить упорядоченную конфигурацию :

В этой версии задача оказывалась неразрешимой ровно в половине случаев.

Головоломка 14-15

В другой версии все плитки, за исключением 14 и 15, изначально находятся на своих местах; задача состоит в том, чтобы поменять местами неправильно стоящие плитки 14 и 15. Эта задача неразрешима; тем не менее, в этом случае можно упорядочить плитки с пустой ячейкой в верхнем левом углу либо выстроить фишки столбцами .

Рис. 1. В начальном положение в головоломке 14-15 плитки 14 и 15 поменяны местами

Рис. 2. Это расположение недостижимо из начального расположения головоломки 14-15 (Рис. 1)

Рис. 3. Но это расположение достижимо из начального расположения головоломки 14-15 (Рис. 1)

Рис. 4. Ещё одно достижимое расположение для головоломки 14-15 (Рис. 1)

Современные модификации

Выпущено множество вариантов головоломки. В некоторых вариантах вместо упорядочивания чисел ставится цель восстановить некоторое изображение. Вместо чисел могут использоваться буквы; присутствие хотя бы двух одинаковых букв может сделать решение головоломки нетривиальной задачей.

Слон спит стоя. А вы?

На английском языке

На немецком языке

Магический квадрат

Одна из задач — переставить плитки таким образом, чтобы сумма чисел в каждом ряду (горизонтали, вертикали или большой диагонали) была равна одному и тому же числу; при этом числовое значение пустой ячейки считается равным нулю . При этом магическая сумма равна 30. Требуется по меньшей мере 35 ходов, чтобы получить магический квадрат из начального расположения, и существует лишь один магический квадрат, достижимый в 35 ходов .

Бубенцы — подвижная игра для детей

Количество игроков: любое
Дополнительно: колокольчик
Дети встают в круг. На середину выходят двое — один с бубенцом или колокольчиком, другой — с завязанными глазами. Все поют:
Трынцы-брынцы, бубенцы,
Раззвонились удальцы:
Диги-диги-диги-дон,
Отгадай, откуда звон!
После этих слов «жмурка» ловит увертывающегося игрока.

Описание игры:

Игра в «Пятнашки» — это самая простая игра в догонялки, но со своим смыслом и даже некоторыми правилами. Количество детей в этой игре неограниченно ничем. Площадку для игры лучше оговорить заранее, и пусть это будет небольшая территория. Иначе маленькие игроки устанут быстрее, чем нужно. Из игроков выбирается водящий, который становится «пятнашкой». Если желающих на роль пятнашки никого нет, тогда вам поможет считалка:

«Ахи, ахи, ахи, ох,
Баба сеяла горох,
Уродился он густой,
Мы бежим, а ты постой!»
«Пятнашка» должен догонять других игроков и запятнать их, проще говоря, задеть рукой. Игрок, которого водящий запятнал, становится сам «пятнашкой». Вот в этот момент нужно громко назвать имя нового водящего, чтобы другие игроки знали, от кого убегать. Тут-то и появляется интерес. Пятнашки меняются одна за другой, а вся дружная убегающая компания детей иногда не успевает перестраиваться от одного на другого водящего. Поэтому хитрый водящий сам может притвориться убегающим игроком и поймать кого-нибудь поблизости. Ну, а после того как водящий ловит игрока, они меняются местами. И все разбегаются дальше.
Даже в эту простую игру можно внести какие-нибудь интересные детали и разнообразить её. Например, игра «Пятнашки с передачей». Отличается от классической игры в пятнашки тем, что тот игрок, которого поймали, не сдаётся сразу, а пытается тут же запятнать своего ловца. Вот тут-то и проявится вся ваша ловкость и быстрота движений. Кто кого перехитрит? «Пятнашка» должен, конечно, быть активней. Иначе он так всю игру и будет бегать со своими пятнами за другими игроками. Да и все остальные игроки заскучают.
Ещё вариант этой игры «Пятнашка с мячом». В этой игре «пятнашке» можно не только бегать, но и кидать мячик в убегающих игроков. Опять же пробежка, ловкость рук, меткость глаз и весёлое настроение сопровождают всю игру.
Можно предположить, что корни этой игры уходят далеко в детство. Ведь дети очень любят марать руки и совсем не любят их мыть. Таким образом, ребёнок с грязными ручками становится настоящим «пятнашкой», который пытается на других взрослых и детях оставить свои следы. Марать свою одежду никто не хочет и все от него убегают.

Пятнашки

  1. Лицензия

Пятнашки — это головоломка, которая представляет собой набор из 15 костяшек с числами в квадратной коробке. Костяшки расположены таким образом, что одна ячейка остается пустой:

13 11 15  
10 8 9 12
1 6 3 2
4 7 14 5
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15  

Цель игры — упорядочить костяшки по номерам, перемещая их в коробке. Желательно сделать как можно меньше перемещений.

Пятнашки представляют собой классическую задачу для моделирования эвристических алгоритмов. Моя программа решает ее с помощью алгоритма A*.

Данный алгоритм является эвристической версией алгоритма поиска в ширину на графе. Вершины для обхода выбираются в соответствии с эвристикой — предполагаемым количеством ходов до цели. В этой программе для оценки расстояния до цели я использовал следюущие эвристики: «Манхэттенское расстояние», «Линейный конфликт», «Последний ход», «Угловые фишки».

Эвристики

Манхэттенское расстояние (Manhattan distance)

Манхэттенское расстояние — это сумма расстояний по строкам и столбцам от текущего расположения костяшки до ее правильной позиции:

       
       
      2
       
  2    
       
       
       

На этой схеме манхэттенское расстояние равно 4.

Линейный конфликт (Linear conflict)

Считается, что костяшка I и костяшка J находятся в линейном конфликте по строке, если они обе стоят в своей строке, но костяшка I находится левее костяшки J, хотя на самом деле должна быть справа:

       
       
       
15 13    
       
       
       
13   15  

На этой схеме I = 15, J = 13.

Мы должны подвинуть одну из костяшек со строки, поэтому можем добавить 2 к манхэттенскому расстоянию. Аналогичным образом рассматривается линейный конфликт по столбцу.

Угловые фишки (Corner tiles)

Рассмотрим правый верхний угол. Пусть «3» или «8» стоит на своей позиции, а на месте «4» — любая другая костяшка:

    3 !4
       
       
       
 
      !4
      8
       
       

В таком случае, чтобы поставить «4» на место, костяшки придется подвинуть. Для этого добавим 2 к манхэттенскому расстоянию. Если «3» или «8» участвует в линейном конфликте (linear conflict), то двойка уже добавлена.

Аналогично с левым верхним и левым нижним углами. Правый нижний угол в эвристике не рассматривается, так как очень сложно скомбинировать этот случай с эвристикой «Последний ход».

Последний ход (Last move)

На последнем ходу мы либо двигаем костяшку «15» влево, либо «12» — вверх:

       
       
       
      15
       
       
       
    15  
       
       
       
      12
       
       
      12
       

Если костяшки не находятся на требуемых позициях («15» — в крайнем правом ряду или «12» — в самой нижней строке), манхэттенское расстояние не учитывает переход через угол. Следовательно, мы можем добавить к нему 2.

Сборка

Выполните следующие команды:

tar xvf 15-xxxx-xx-xx.tar.gz
cd 15-xxxx-xx-xx
cmake -DCMAKE_BUILD_TYPE=Release .
make

Использование

Синтаксис:

./15  

где параметры и  — это текстовые файлы с начальным и конечным состояниями головоломки.

В файлах состояний хранятся числа от 0 до 15:

13 11 15  5
10  8  9  7
 1  6  3  2
 4 12 14  0

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

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 0

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

Пример работы программы

board size = 4, 16
using random data for source and target
usage: ./15  
source state:
 3  7 11 15
 2 13  9  4
 5 14  6 12
 8 10  1  0
target state:
 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15  0

warning: unsolvable case, fixing source state:
source state:
 3  7 11 15
 2 13  9  4
 5 14  6 12
 8  1 10  0
target state:
 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15  0

num_pos=153022
time step 1234619518: =49, closed=152144, open=3, pos/sec=76511.000000
building path ...
Result:
step=0
 3  7 11 15
 2 13  9  4
 5 14  6 12
 8  1 10  0

step=1
 3  7 11 15
 2 13  9  4
 5 14  6  0
 8  1 10 12



step=48
 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15  0

steps=49
time=1.825000
  • Стюарт Рассел, Питер Норвиг. Искусственный интеллект. Современный подход. — Вильямс, 2007;
  • Shaun Gause, Yu Cao. Heuristics for sliding-tile puzzles (Computer Science and Engineering Department, University of South Carolina);
  • Richard E. Korf, Larry A. Taylor. Finding Optimal Solutions to the Twenty-Four Puzzle (Computer Science Department, University of California, Los Angeles).