Последнее время увлекся задачами о расстановке максимального количества
не атакущих друг друга фигур на шахматной доске. Ну, о 8 ферзях все знают;
про остальные есть у Гика, "Шахматы и математика".
Поставил общую задачу. Под "фигурой" будем понимать логическую
функцию четырех аргументов - целочисленных координат двух клеток.
Функция выдает True, если первая клетка находится под ударом из второй
(и наоборот) и False, если атаки нет. Например, ладья и слон:
![$bishop[i_1, j_1, i_2,j_2]=Abs[i_1-i_2]==Abs[j_1-j_2]$ $bishop[i_1, j_1, i_2,j_2]=Abs[i_1-i_2]==Abs[j_1-j_2]$](https://dxdy-03.korotkov.co.uk/f/a/0/3/a03cd8377a824ebcc1f0483b6d09bbbf82.png)
ферзь:

и т.д.
Замечу, что рассматриваем только
одинаковые фигуры и функции, симметричные по паре клеток, т.е.
![$f[i_1,j_1,i_2,j_2] \equiv f[i_2,j_2,i_1,j_1]$ $f[i_1,j_1,i_2,j_2] \equiv f[i_2,j_2,i_1,j_1]$](https://dxdy-04.korotkov.co.uk/f/f/2/2/f2273e681ad4548304de926f785d39bd82.png)
Фигуры могут быть как классическими, так и экзотическими,

но без жесткой фантастики, типа зависимости от времени и т.д.
Доски только квадратные.
Когда стал смотреть примеры алгоритмов поиска расстановок
с максимальным числом фигур, убедился, что все они используют
свойства конкретной фигуры - симметрию, форму атакуемой области и т.д.
Именно за счет этого ту же расстановку ферзей можно найти за доли секунды,
но ладью в этот алгоритм уже не подставишь!
А хочется учитывать и несимметричные случаи.
Я написал универсальную рабочую программу (в Wolfram Math), которая
по функции фигуры и размеру доски выдает все максимальные неатакующие расстановки.
К сожалению, из-за универсальности приходится использовать простейший алгоритм:
- начинаем с набора из 64 расстановок "одна фигура на доске";
- для каждого варианта находим область небитых клеток и ставим
на каждую из них вторую фигуру;
- удаляем дубликаты, объединяем в один набор и к началу,
пока можно добавлять.
Надо сказать, что Wolfram использует компактный, близкий к математике язык;
можно обойтись без For, If и т.д. Встроенные в ядро функции Map[], Nest[] работают
быстро; но из-за огромного числа вариантов(особенно у "слабых" фигур типа пешки)
доска 8х8 считается о-о-очень медленно.
Может, кто-то интересовался подобными вещами или знает ресурс по теме?
Как оптимизировать алгоритм поиска, не теряя общности?
Хотел на каждом шаге оставлять только варианты с максимальным числом
свободных полей. Оказалось, что на ферзях такой подход дает сбой, пропускает
максимальные расстановки!
Мне кажется, задача интересная; я не нашел в сети даже упоминаний про общий
алгоритм. Если кто реально заитересуется - напишите в личку!