Мат конем и слоном - обучение шахматам онлайн. Матование Когда возможно поставить мат

Сегодня мы рассмотрим мат Конем и Слоном. Эта позиция была хорошо изучена Филидором, очень давно, в 1749 году. Это не самый распространенный мат, он встречается один раз на 5000 игр, но Вам необходимо знать, как использовать вместе коня и слона.

Мне попадалось множество учебников, в которых было написано, как поставить мат одинокому королю при помощи коня и слона, но по ним невозможно было освоить этот прием. Там были показаны движения, даны какие-то объяснения и кажется, что сможешь сделать это самостоятельно. Но когда Вы пытаетесь это сделать – ничего не выходит.

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

Я обещаю, вы сможете поставить мат Слоном и Конем одинокому королю, после того как прочитаете и поймете материал. Вы спрашиваете, почему это сложно? Потому что, иногда, даже гроссмейстеры не в состоянии сделать это за пятьдесят ходов!

Ниже представлен пример, как я играл против Deep Fritz 14 (ЭЛО 3150 +). Если Вы cможете выиграть компьютер в таком окончании, то обыграть человека не составит труда.

Идея №1

Единственный способ поставить мат этими фигурами – загнать короля противника в правильный угол, а именно в угол, цвет которого соответствует цвету Вашего слона. Поэтому, если у Вас белопольный слон , Вам нужно загнать короля в угол a8 или угол h1 , которые являются белыми углами.

Идея №2

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

Идея №3

Давайте попробуем поставить мат программе с рейтингом 3150 при помощи коня и слона. Первым шагом необходимо загнать короля противника в угол с неправильным цветом.

Идея №4

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

Посмотрите на Большой треугольник . Король черных не может сбежать и ограничен всего 8-ю квадратами. Слон расположен на идеальном поле . Идеальное поле находится на диагонали (стороне треугольника), на одно поле выше угла: b3 или f7 . Конь также расположен на идеальном поле. Идеальное поле для коня - d3 , он должен находиться в той – же горизонтали, что и слон, но на одно поле дальше.

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

Красными крестами показаны поля, которые находятся под контролем белых.

Мы заставили короля черных переместиться в Средний треугольник. Основная идея состоит в том, что теперь слон находится на новом идеальном поле d7 , которое расположено на стороне треугольника, на расстоянии одного поля от края доски. Конь также находится на новом идеальном поле d5 , на той - же вертикали или горизонтали, что и слон, но на расстоянии одного поля. Король белых находится снизу и оттесняет короля черных в Малый треугольник. Король черных ограничен 6-ю полями.

Мы почти закончили. Король черных теперь внутри Малого треугольника и ограничен всего 2-мя полями . Можно поставить мат в 2 хода. Все должно получиться.

Я надеюсь, мой анализ был полезен, и вы разобрались, как матовать короля Конем и Слоном. Я рекомендую наработать практику, играю против компьютера. У Вас появиться уверенность, после того, как сможете многократно нанести поражение Рыбки, Фритцу, Гуддини и др. Просто выставляйте случайную позицию и попытайтесь загнать Короля в правильный угол. Вы можете несколько раз посмотреть партию и почитать комментарии и «идеи», чтобы отточить алгоритм. Я знаю, что это работает, т.к. сам это делал. Напишите о своих успехах в комментариях.

Мат конем и слоном в шахматах - это очень сложная стратегия, мат при такой игре можно достичь после 35-ти ходов. Это заставляет вспомнить о правиле 50-ти ходов. Поскольку разрешимое число ходов по существующим шахматным правилам 50, такое завершение требует точной игры.

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

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

Мат ставится в самом углу поля, на одном из шести полей: того цвета который совпадает с цветом слона в этих углах.

Сначала разберемся как ставится мат в углу. И так, король поставлен в требуемый для условия угол, и лишен возможности его покинуть. Обратим внимание, как организовано взаимодействуют конь и слон в игре. Эти две фигуры в полной мере дополняют друг друга. Конь занимает чёрные поля, слон - белые. В этой стратегии мат можно поставить менее чем за девять ходов.

1.Король a7
2. Король d7 Kороль b7
3. Король d8 Король b8
4. Слон a6

После всего этого король еще больше ограничен в своих движениях.
5. Король a7 Слон c8 Король b8
6. Конь b4 Король a7

7. Король c7 Король a8
8. Слон b7+ Король a7
9. Конь c6++

Поскольку поставить мат можно только в случае, когда король соперника расположен в углу, соответствующему по цвету слону, сейчас мы рассмотрим ситуацию как можно переместить короля из угла в угол.
1 Конь f7+ Король g4
2. Слон f5 Король f8
3. Слон h7 Король e8
4. Конь e5 Король d8

Черные шахматы хотят пробиться в угол а1.
5. Король e6 Король c7
6. Конь d7 Король b7
7. Слон d3 Король c6
8. Слон a6 Король c7
9. Слон b5 Король d8
10. Конь b6 Король c7
11. Конь d5++.

Способ этой игры, был придуман Филидором, французским шахматистом в 1777 году.

Интересные сведения по этой технике , на 47 шахматном чемпионате в Минске 1979 году между Балашовым и Аникаевым появился эндшпиль "конь и слон против короля". Аникаев за 20 ходов проверил технику матования соперника. Она оказалась удачной: своими действиями Балашов заставил короля двигаться в угол, соответствующих цветам поля, по которым двигался слон. И только после этого Аникаев сдался.

А можно ли поставить мат королем и слоном?

«Нельзя!» – скажете вы с уверенностью. И будете правы, если сделаете правильную оговорку.

«Можно!» И здесь вы правы при определенных условиях.

Давайте разберемся с этими нехитрыми нюансами.

Когда невозможно поставить мат?

Все очень просто. При отсутствии других фигур, кроме королей и слона мат поставить невозможно. Матовая позиция не может возникнуть на доске даже при всем желании обеих сторон.

Их просто не существует в природе шахмат. Просто расставьте фигуры и попробуйте.

Когда возможно поставить мат?

Первое и главное условие:

1.Наличие хотя бы одной фигуры в стане соперника, кроме короля

Например:

Обратите внимание, что такую позицию можно получить только совместными усилиями обеих сторон)

Отсюда второе условие:

2.Ошибочная игра соперника

Белые играют 1.Сh3 , нападая на коня.

1...Кf4??

Фраза «Лучшая защита -нападение», — не для этого случая)

2. Сd7X

И еще одно условие:

3.Неудачное расположение фигур

Например:

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

Например 1...Фf2 2.Се5! Фе1 (2...g4 3.Cf6X) 3.g3+ Ф:g3 4.C:g3X

Парадоксы эндшпиля

Давайте сравним две позиции:

Здесь у белых лишняя фигура и пешка. Казалось бы вполне достаточно для победы.

Однако есть нюансы. Точнее нюанс. Пешку в ферзи провести не получается. Черный король заперся в углу и выкурить его оттуда не представляется возможным. Он просто ходит с h8 на g7 и обратно. Мат также не поставить, только пат. Ничья

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


В подобных позициях ключевое значение имеет цвет углового поля . Если это поле цвета слона, — возможны и мат, как в предыдущем примере, так и просто оттеснение короля из угла.

Какой результат при просрочке времени?

В заключение еще ряд моментов, имеющих практическое значение и связанные со временем.

  • В позиции король и слон против короля без других фигур будет сразу зафиксирована ничья. Даже если кто-то просрочил время. Поскольку мат невозможен.
  • А вот в позиции король и слон белых против короля и пешки черных при просрочке времени белыми им будет засчитано поражение во всех случаях. Поскольку теоретически пешка может пройти в ферзи.
  • Если же в этой же ситуации время просрочили черные, — фиксируется ничья во всех случаях, кроме позиции, в которой пешка крайняя и угловое поле – цвета слона. Здесь теоретически возможен мат, как на диаграмме выше.

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

Благодарю за интерес к статье.

Если вы нашли ее полезной, сделайте следующее:

  1. Поделитесь с друзьями, нажав на кнопки социальных сетей.
  2. Напишите комментарий (внизу страницы)
  3. Подпишитесь на обновления блога (форма под кнопками соцсетей) и получайте статьи к себе на почту.

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

Рассмотрим пример. С двумя конями загнать короля в угол трудов не доставляет, но это ни к чему не ведет, на доске – ничья:

1.Кc6+ — Крc8

В случае 2.К c 5 (2.Кc 7) – пат. Или 2.К e 7+ — Крb 8 , повторяя позицию.

Мат возникает, только, если соперник подставляется под мат – 1…Крa 8.

Попробуем иначе, пусть ход черных. Тогда

1.Кc 5 — Крa 8

Теперь, если 2.Кc 6 (2.Кa 6), то пат. Также ничего не дает

2.Кe 4 — Крb 8 3.Кd 6 — Крa 8 4.Кd 5 — (4.Кb 5) 4…Крb8

Однако, если король не одинок и у слабейшей стороны есть еще и пешка (иногда может быть фигура), тогда мат возможен:

1.Кhf5 — h4 2.Кd4 — h3 3.Кc6 — h2 4.Кe8 — h1Ф 5.Кc7#

1…Крb 8 2.Кd 4 — Крa 8 3.Кc 6 — h 4 4.Кe 8 — h 3 5.Кc7#

Наличие пешки исключает пат и благодаря этому создается условие для мата. Главное в таких окончаниях – положение пешки. Нужно загнать короля в угол и при этом заблокировать конем пешку до нужного момента.

Такое окончание, как два коня против пешки одно из сложнейших в шахматах. Заблокировать пешку конем не так уж сложно, но при этом нужно оттеснить короля оппонента в угол только при помощи своего короля и одного оставшегося коня. По правилам, если в течение 50-ти ходов ни одна фигура не была взята и ни одна пешка не сделала хода, то партия заканчивается ничейным результатом.

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

1.Кf7 — Кd6 2.Кh6+ — Крh8 3.Кg5 — Кe4 4.Кgf7#

1.Кc 8 — Кd 6 (1…Крh 8 2.Кe 7 Кf 6 3.Кg 5 Кg 8 4.Кf 7#) 2.Кe 7+ — Крh 8 3.Кg 5 — Кe 4 4.Кf 7#

Коню приходится метаться из стороны в сторону, предлагая себя в качестве жертвы или размен, но мы знаем, что два коня – не угроза одинокому королю, поэтому не поддаемся на провокации, не берем коня, а ставим мат.

Теория окончания «Два коня против пешки» была разработана известным исследователем шахмат А. Троицким еще в начале XX века. Эта теория получила название «Линия Троицкого». По ней, если пешка слабейшей стороны блокируется не позднее, чем показано на диаграмме слева, то возможность мата гарантируется (иногда пешка может находиться за линией Троицкого и тогда все зависит от положения короля). Но в определенных вариантах, чтобы соорудить мат требуется более 100 ходов. Это нарушает правила шахмат. Поэтому немецкий гроссмейстер К. Мюллер создал теорию, по которой число ходов для мата не превышает 50-ти – «Вторая линия Троицкого» (на диаграмме справа).

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

  • Tutorial

Хотите озадачить начинающего шахматиста?
Попросите его поставить мат конём и слоном.

Хотите озадачить начинающего программиста?
Попросите его рассчитать мат конём и слоном.

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

Постановка цели

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

В этой публикации я расскажу, как я решал эту задачу, с какими сложностями пришлось столкнуться, а также продемонстрировать, что в итоге получилось. Используемые технологии: C#, JavaScript, PHP, HTML, CSS.

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

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

Сколько всего вариантов?

На шахматной доске 64 клетки. У нас четыре фигуры.
Количество возможных комбинаций - 64 * 64 * 64 * 64 = 16,777,216.

Можно оставить только белопольного слона.
Количество вариантов уменьшится вдвое: 64 * 32 * 64 * 64 = 8,388,608.
Именно столько позиций будет в нашей базе решений.

На самом деле комбинаций ещё меньше: на одной клетке не может стоять две фигуры, короли не могут стоять на соседних клетках, чёрный король не может быть под шахом и так далее. Забегая вперёд скажу, что в базе решений оказалось 5,609,790 комбинаций, массив будет заполнен на 67%.

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

Для хранения каждой комбинации определена такая структура:

Struct Combo { public Coord whiteKing; public Coord whiteBishop; public Coord whiteKnight; public Coord blackKing; }
Внутри используется ещё одна структура Coord для записи координат фигуры, с возможностью вычисления индекса от 0 до 63, а также с перегруженным оператором сравнения.

Public struct Coord { public byte x; // шахматная вертикаль от 0 до 7 (от a до h) public byte y; // шахматная горизонталь от 0 до 7 public int index { get { return x + y * 8; } set { x = (byte) (value % 8); y = (byte) (value / 8); } } public static bool operator == (Coord a, Coord b) { return a.x == b.x && a.y == b.y; } }
Эта структура оказалась очень удобной для передачи в качестве аргумента в различные вспомогательные функции, например:

Bool isCheck (Combo combo); // Проверка позиции на шах bool isCheckmate (Combo combo); // на мат bool isCheckByBishop (Combo combo); // есть ли шах от слона
Однако для записи результата базы решений этой структуры не достаточно, ещё нам потребуется…

Белый ящик

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

Составной частью «белого ящика» является следующая структура:

Struct WhitesMove { public Combo combo; public byte moves; // сколько ходов до мата public Coord moveFrom; // правильный ход - откуда public Coord moveTo; // куда }
Для организации «белого ящика» проще всего открыть четырёхмерную матрицу. Каждая размерность этой матрицы соответствует возможной позиции каждой фигуры:

WhitesMove [ , ] box = new WhitesMove ;
первая размерность - координата белого короля.
вторая размерность - координата белого слона / 2.
третья размерность - координата белого коня.
четвёртая размерность - координата чёрного короля.

Главное - не перепутать их порядок:) Массив получится на 33% разряженным, но уж очень удобным для обработки. Именно в этом массиве будет храниться 8,388,608 записей для решения комбинаций.

Кстати, прежде чем начать писать все алгоритмы перебора, я создал пустой проект и проинициализировал эту четырёхмерную матрицу, дабы убедиться, что памяти хватит и не надо будет что-то дополнительное изобретать. Видимо, сказался опыт участия в олимпиадах по информатике прошлого тысячелетия, где размер структуры не мог превышать 64 килобайт, ибо Turbo Pascal 7.0.

Идея алгоритма

Кратко опишу основную идею решения этой задачи. В основу взят алгоритм поиска вширь, который пришлось немного доработать, так как в шахматы играют двое и ходы делаются по очереди. Поэтому вместо одной очереди нам потребуется две - «чёрная» и «белая».

Queue blackQueue = new Queue(); Queue whiteQueue = new Queue();
Со структурой WhitesMove мы уже познакомились. Структура BlacksMove немного проще, так как в ней нет надобности хранить последний ход чёрных.

Struct BlacksMove { public Combo combo; public byte moves; }
Сначала в «чёрную очередь» мы разместим все матовые позиции, в которых ход чёрных. Потом из каждой такой позиции будем делать обратный ход за белых и формировать «белую очередь» - список позиций, в которых ход белых.

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

Основной алгоритм в виде псевдокода:

Очищаем "белую очередь", "чёрную очередь", "белый ящик" Ищем все матовые позиции Добавляем их в "чёрную очередь" Повторять { Пока "чёрная очередь" не пуста Берём позицию из "чёрной очереди" Перебираем для неё все обратные ходы белых Если нет шаха чёрному королю Если такой позиции нет в "белом ящике" Добавляем позицию в "белый ящик" Добавляем позицию в "белую очередь" Пока "белая очередь" не пуста Берём позицию из "белой очереди" Перебираем для неё все возможные обратные ходы чёрного короля Если из этой позиции любой ход ведёт к известной позиции из "белого ящика" Добавляем позицию в "чёрную очередь" } Пока "чёрная очередь" не пустая В "белом ящике" находится база решений

Матовые позиции

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

Foreach (Combo combo in AllCheckmates()) { BlacksMove checkmate = new BlacksMove { combo = combo, moves = 0 }; blackQueue.Enqueue(checkmate); }
Всего найдено 232 матовые позиции. Напомню, что мы ограничились только белопольным слоном.

Некоторые из них достаточно экзотические, не существующие и «кооперативные», это когда чёрный король сам полез под мат.

Шахматистам хорошо известно, что мат конём и белопольным слоном нужно ставить в белом углу. В чёрном углу мат возможен только если чёрные будут подыгрывать. Я специально разместил фото с именно таким псевдоматом в начале статьи, чтобы спровоцировать внимание настоящих шахматистов:)

Мат в один ход

Следующий этап - сделать обратный ход белых. То есть, для каждой найденной матовой позиции сделать все возможные обратные ходы белых .

Как сделать обратный ход? Учитывая, что взятия в наших позициях не предусмотрены, алгоритм достаточно простой - сделать любой ход белых, после которого не будет шаха чёрному королю.

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

// Пока "чёрная очередь" не пуста while (blackQueue.Count > 0) { // Берём позицию из "чёрной очереди" BlacksMove black = blackQueue.Dequeue(); // Перебираем для неё все обратные ходы белых foreach (WhitesMove white in AllWhiteBackMoves(black)) // Если нет шаха чёрному королю if (!isCheck(white.combo)) // Если такой позиции нет в "белом ящике" if (!whiteBox.Exists(white.combo)) { // Добавляем позицию в "белый ящик" whiteBox.Put (white); // Добавляем позицию в "белую очередь" whiteQueue.Enqueue(white); } }

Кстати, про yield

Использование енумераторов с yield-механизмом позволяет очень красиво реализовать различные переборы, например, так выглядит функция перебора всех возможных ходов белыми фигурами:

IEnumerable AllWhiteBackMoves(BlacksMove black) { foreach (WhitesMove white in AllWhiteKingMoves(black)) yield return white; foreach (WhitesMove white in AllWhiteBishopMoves(black)) yield return white; foreach (WhitesMove white in AllWhiteKnightMoves(black)) yield return white; }


Всего было найдено 920 таких позиций, вот самые интересные:

Ход конём:

Ход слоном:

Ход королём:

Мат в полтора хода

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

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

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

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

Вот как выглядит эта часть алгоритма:

// Пока "белая очередь" не пуста while (whiteQueue.Count > 0) { // Берём позицию N из "белой очереди" WhitesMove white = whiteQueue.Dequeue(); Combo whiteFigures = white.combo; // Перебираем для N все возможные обратные ходы чёрного короля foreach (BlacksMove black in AllBlackBackMoves(white)) { bool solved = true; // Перебираем все возможные ходы чёрного короля foreach (Coord blackKing in AllKingMoves(black.combo.blackKing)) { whiteFigures.blackKing = blackKing; // переставляем чёрного короля if (isCheck(whiteFigures)) // под шах не ходим continue; if (box.Exists(whiteFigures)) // решённые позиции пропускаем continue; solved = false; // чёрный король смог "улизнуть" break; } // Если из этой позиции любой ход ведёт // к известной позиции из "белого ящика" if (solved) // Добавляем позицию в "чёрную очередь" blackQueue.Enqueue(black); } }
Всего было найдено 156 комбинаций «Мат в полтора хода».

Итеративность полуходов

Описанные алгоритмы создания полуходов необходимо зациклить. Из «чёрной очереди» мы формируем «белую очередь», а потом наоборот - из «белой» формируем «чёрную». И так до тех пор, пока не будут исчерпаны все новые позиции. «Белая коробка» заполняется на этапе формирования «белой очереди», так как в неё помещаются позиции, в которых ход белых.

Готовый алгоритм перебора всех вариантов отработал где-то за 12 минут и остановился на 33 ходу. Именно столько максимум ходов нужно, чтобы заматовать чёрного короля конём и слоном из любой позиции.

Кстати, таких «самых сложных» позиций оказалось не так много, всего 156, вот одна из них:

Мата не будет!

Есть немало позиций, в которых даже после хода белых чёрный король может съесть коня или слона и выйти на ничью. Также есть патовые варианты. Вот несколько самых интересных позиций.

Как хранить базу решений

Каким способом хранить найденную базу решений?
Самый простой и неправильный способ - использовать сериализацию. Засериализованный четырёхмерный массив структуры занял 1.7 гигабайта(!) на диске. Процесс сериализации длился минут шесть, на десериализацию потребовалось примерно столько же.

Такой вариант, ясное дело, не подходит. К тому же, на практике нет надобности использовать весь четырёхмерный массив. Для конкретной позиции нужна только одна запись.

Эврика! Для экономии места ещё можно избавиться от хранения координат фигур для каждой комбинации. Когда у нас есть четырёхмерный массив, то позиция каждой фигуры на доске однозначно определяется её индексом в массиве.

Было решено хранить всю базу решений в одном файле - как линейную развёртку четырёхмерного массива. Для любой возможной позиции вычисляется адрес, по которому записан правильный ответ.

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

6 бит. Сколько ходов до мата - это целое число от 0 до 33.
2 бита. Какая фигура ходит - три возможных варианта, король, слон или конь.
6 бит. Куда фигура ходит - индекс поля на доске от 0 до 63.

Значит, на каждую запись решения достаточно два байта:
1 байт - сколько ходов до мата, или 0, если позиция незнакомая.
2 байт - FFNNNNNN
FF - номер фигуры, которой нужно ходить (1 - король, 2 - слон, 3 - конь)
NNNNNN - координата клетки - куда ходить (от 0 до 63).

Итак, файл базы решений занимает 64 * 32 * 64 * 64 слов = ровно 16 мегабайт. Размещение фигур задаётся координатами каждого слова, в первом байте - количество ходов до мата (или 0 если решения нет), во втором байте хранится правильный ход.

Можно было бы ещё в два раза уменьшить размер файла, если не хранить количество ходов до мата, но так играть будет не интересно.

Координаты чёрнопольного белого слона

Пришло время платить за оптимизацию. Нужно реализовать алгоритм пересчёта координат для комбинаций с «чёрно-белым» слоном.

Это было сделано следующим образом. Если координата слона попадает на чёрное поле, то необходимо координаты всех фигур на доске «перевернуть». При этом координата Y остаётся неизменной, а X меняется на 7-X. Наглядная демонстрация переворота координат см. на рисунке.

Если слон стоит на белой клетке, то сначала необходимо «перевернуть» координаты всех фигур. Потом искать позицию в базе решений. И ещё раз «перевернуть» считанную оттуда координату правильного хода.

Визуализация базы решений

Итак, Задача решена!
База решений создана.
Но как её продемонстрировать?

Самый наглядный способ - использовать web-технологии, чтобы можно было просто дать ссылку на работающий пример. На моей «формуле программиста» уже был создан фотокурс "

Похожие публикации