Не нашлось третье покрытие. Результат вполне ожидаемый.
Удалось найти всего три цепочки в третьем покрытии:
Код:
#3
1 1 3 3 3 3 3
1 1 1 1 3 3 3
1 1 1 1 1 1 3
1 1 1 1 3 3 3
1 1 3 3 3 3 3
1 1 3 3 3 3 3
1 1 3 3 3 3 3
13 109 47 79 139 199 211
53 61 97 173 43 131 239
17 41 73 113 157 229 167
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
Для заданной пары ортогональных точных покрытий и заданной модели комплекта покрытий полный перебор в поиске третьего покрытия выполняется примерно 5 секунд.
Предлагается такая схема:
1. генерируем пару ортогональных покрытий (это выполняется очень быстро, доля секунды);
2. пытаемся по паре ортогональных покрытий найти третье покрытие, это тоже выполняется быстро;
если третье покрытие не найдено, возврат на пункт 1; если же найдено, то -
3. по трём покрытиям пытаемся найти четвёртое;
если не найдено четвёртое покрытие, возврат на пункт 1; если найдено - задача решена: комплект из 4-х точных попарно ортогональных покрытий найден.
Всё это надо, разумеется, делать в одной программе.
Кто поможет реализовать?
Замечу, что получение комплекта из 4-х точных попарно ортогональных покрытий массива ещё не гарантирует построение пандиагонального квадрата из чисел данного массива - может построиться и не построиться.
Однако если будет доказано, что ни одного комплекта не существует, это равносильно доказательству несуществования пандиагонального квадрата для заданного массива.
-- Пн июл 13, 2015 00:57:26 --Посмотрите, какой интересный подход к решению задачи предложил
whitefox:
Эксперименты с программой поиска четвёрок попарно ортогональных точных покрытий показали, что поиск идёт не достаточно быстро, в то время как генерация полумагических квадратов осуществляется с высокой скоростью.
Поэтому предлагаю следующий подход к созданию многопоточной программы:
- программа должна иметь "генератор заданий", "диспетчер" и неограниченное количество "обработчиков";
- каждый из этих элементов выполняется в отдельном потоке;
- генератор заданий находит полумагические квадраты и помещает их в "очередь заданий";
- диспетчер извлекает очередное задание из очереди и передаёт его очередному обработчику;
- если "очередь обработчиков" пуста, то диспетчер создаёт нового обработчика и передаёт задание ему;
- обработчик полным перебором проверяет возможность из данного полумагического квадрата построить пандиагональный магический квадрат;
- когда обработчик завершает своё задание, он становится в очередь обработчиков.
Так как обработчики работают параллельно, то при выполнении такой программы на "очень многоядерном" процессоре (а лучше на кластере), скорость обработки может сравняться со скоростью генерации.
Думаю, что для программистов, умеющих писать многопоточные программы, весьма интересная задача.
Поясню ---
"генератор заданий находит полумагические квадраты..."
Полумагический квадрат - это и есть пара точных ортогональных покрытий массива.