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