Используя случайный поиск, я получил только 92 квадрата с одним неиспользованным местом (8 пропущенных чисел: 5041 9025 289 10000 4356 8464 3364 3249)
1 5 2 1 2 9 7 5 6 9 5
6 1 0 8 9 3 8 4 4 1 2
9 7 2 2 5 0 0 4 8 8 2
1 6 5 9 6 0 4 4 7 7 4
4 4 2 7 6 1 2 9 0 2 2
2 9 6 1 7 8 4 4 0 9 3
6 5 5 3 2 6 0 1 4 0 6
4 7 6 1 8 1 1 8 2 8 1
8 0 1 3 4 8 1 5 3 2 9
0 5 9 6 9 8 8 6 7 4 5
6 6 2 9 1 7 3 9 6 9
Алгоритм в основном использует в качестве решения кодирование перестановки на входе (пространство поиска равно 100!), А затем помещает каждое число в «верхнюю» правовую позицию. Значение решения измеряется как сумма квадратов длин помещенных чисел (чтобы придать большее значение длинным числам) и количеству оставшихся «дырок» (увеличение количества отверстий в ИМО должно повысить вероятность того, что другое число будет вписывается).
Код вообще не был оптимизирован и способен декодировать только несколько сотен решений в секунду. Текущее решение было найдено после 196 тыс. Попыток.
UPDATE
В настоящее время наилучшим решением с таким подходом является 93 без свободных отверстий (7 пропущенных чисел: 676 7225 3481 10000 3364 7744 5776):
9 6 0 4 8 1 0 0 9 3 6
6 4 0 0 2 2 5 6 8 8 9
1 7 2 9 4 1 5 4 7 6 3
5 8 2 3 8 6 4 9 6 5 7
2 4 4 4 1 8 2 8 2 7 2
1 0 8 9 9 1 3 4 4 9 1
2 1 2 9 6 1 0 6 2 4 1
2 3 5 5 3 9 9 4 0 9 6
5 0 0 6 1 0 3 5 2 0 3
2 7 0 4 2 2 5 2 8 0 9
9 8 2 2 6 5 3 4 7 6 1
Это решение (все 100 размещенных чисел), но с использованием сетки 12x12 (НАМНОГО проще)
9 4 6 8 7 7 4 4 5 5 1 7
8 3 0 5 5 9 2 9 6 7 6 4
4 4 8 3 6 2 6 0 1 7 8 4
4 8 4 2 9 1 4 0 5 6 1 4
9 1 6 9 4 8 1 5 4 2 0 1
9 4 4 7 2 2 5 2 2 5 0 0
4 6 2 2 5 8 4 2 7 4 0 2
0 3 3 3 6 4 0 0 6 3 0 9
9 8 0 1 2 1 7 9 5 5 9 1
6 8 4 2 3 5 2 6 3 2 0 6
9 9 8 2 5 2 9 9 4 2 2 7
1 1 5 6 6 1 9 3 6 1 5 4
Он был найден с использованием подхода «грубой силы», начиная со случайной матрицы и сохраняя случайно меняющиеся цифры, когда это улучшало покрытие.
Это решение было найдено крайне развернутой программой на C ++, автоматически созданной скриптом Python.
Обновление 2
Используя инкрементальный подход (т. Е. Сохраняя более сложную структуру данных, чтобы при изменении матричного элемента число покрываемых целей можно было обновлять, а не пересчитывать), я получил гораздо более быстрый поиск (около 15 тыс. Матриц в секунду, исследованных с помощью Python реализация работает с PyPy).
Через несколько минут этой версии удалось найти квази-решение 99 (число по-прежнему отсутствует):
7 0 5 6 5 1 1 5 7 1 6
4 6 3 3 9 8 8 6 7 6 1
3 9 0 8 2 6 1 1 4 7 8
1 1 0 8 9 9 0 0 4 4 6
3 4 9 0 4 9 0 4 6 7 1
6 4 4 6 8 6 3 2 5 2 9
9 7 8 4 1 1 4 0 5 4 2
6 2 4 1 5 2 2 1 2 9 7
9 8 2 5 2 2 7 3 6 5 0
3 1 2 5 0 0 6 3 0 5 4
7 5 6 9 2 1 6 5 3 4 6
ОБНОВЛЕНИЕ 3
Ok. Через некоторое время (не знаю, сколько) та же самая программа на Python действительно нашла полное решение (на самом деле несколько) ... вот один
6 4 6 9 4 1 2 9 7 3 6
9 2 7 7 4 4 8 1 2 1 7
1 0 6 2 7 0 4 4 8 3 4
2 1 2 2 5 5 9 2 9 6 5
9 2 5 5 2 0 2 6 3 9 1
1 6 3 6 0 0 9 3 7 0 6
6 0 0 4 9 0 1 6 0 0 4
9 8 4 4 8 0 1 4 5 2 3
2 4 8 2 8 1 6 8 6 7 5
1 7 6 9 2 4 5 4 2 7 6
6 6 3 8 8 5 6 1 5 2 1
Программу поиска можно найти здесь ...