Представляю свой алгоритм в том виде, как я описла его для ice00.
"Мы будем брать массив из 36 чисел. Значит, магическая константа нам тоже известна.
Первый этап: образуем все наборы по 4 строки так, что сумма чисел в строках равна магической константе квадрата. Такие наборы мы можем сделать все. Так?
Для примера возьмём такой массив смитов:
Код:
562, 690, 483, 27, 391, 634, 852, 378, 438, 382, 202, 535, 121, 517, 274, 166, 1255, 454, 22, 94, 85, 1165, 526, 895, 576, 346, 778, 728, 355, 4, 654, 762, 729, 319, 58, 265
Магическая константа равна 2787 (как я уже говорила, у меня очень много полумагических квадратов получается с такой магической константой; есть вероятность получить магический квадрат).
Тогда пример набора из четырёх строк такой:
Код:
4 346 355 576 728 778
22 85 94 526 895 1165
27 391 483 562 634 690
121 166 274 454 517 1255
Сколько будет таких наборов строк, я не могу сказать, но их будет конечное множество, и количество их не очень велико, вполне реально их все получить. Понятно, что все числа в таком наборе должны быть различные.
Заметьте, что числа в каждой строке следуют в порядке возрастания.
На следующем этапе берётся такой набор из четырёх строк (как показан выше) и из него получаются все варианты. Для получения вариантов можно применить много способов, самый простой: переставить все строки и столбцы в этом наборе строк. Вариантов, полученных таким способом, будет 17280. Это не очень много вариантов. Другой способ: перестановка всех чисел в строках и перестановка строк. Этот способ даст намного больше вариантов, но это выгодно. Можно попробовать оба способа.
На следующем этапе обрабатывается каждый набор строк, полученный на предыдущем этапе.
Теперь у нас остались свободными 12 чисел массива, которые мы должны разместить в двух строках квадрата. Достаточно варьировать всего три переменные; варьируются элементы I, J, K.
Код:
4 346 355 576 728 778
22 85 94 526 895 1165
27 391 483 562 634 690
121 166 274 454 517 1255
X X K X X X
I X X X X J
Все остальные элементы (Х) вычисляются в зависимости от значений I, J, K. Остаётся проверить, будут ли принадлежать все эти вычисленные элементы массиву из 12 чисел (за вычетом элементов I, J, K). Варьируемые переменные I, J, K пробегают весь массив из 12 чисел".
Теперь покажу результаты теста для массива смитов:
Код:
22, 94, 346, 382, 562, 778, 1822, 1966, 2326, 2362, 2578, 2902, 20362, 20506, 20542, 20974, 21226, 21262, 681817, 682177, 682393, 682609, 682681, 682897, 1446106, 1446142, 1446178, 1446538, 1446574, 1446934, 3003898, 3004186, 3004402, 3004618, 3004654, 3004762
Из данного массива программа генерирует всего 833 строки, содержащие по 6 чисел, так, что сумма чисел в каждой строке равна магической константе квадрата -
. На первом этапе среди всех наборов из 4-х строк должен быть получен такой набор:
Код:
346 2902 20542 682177 1446142 3004654
382 1822 21226 682897 1446538 3003898
562 1966 21262 682393 1446178 3004402
778 2326 20506 681817 1446574 3004762
На следующем этапе, который является самым сложным, из этого набора должен быть получен такой набор из 4-х строк:
Код:
1822 21226 682897 1446538 3003898 382
3004762 681817 778 2326 1446574 20506
1446142 2902 3004654 20542 346 682177
21262 1446178 1966 562 682393 3004402
Очевидно, что из первоначального набора этот набор получается комбинацией двух приёмов: перестановка строк и перестановка чисел в строках.
Теперь мы подошли к последнему этапу – надо достроить каждый полученный на предыдущем этапе набор из 4-х строк до квадрата 6х6. Понятно, что далеко не каждый набор из 4-х строк может быть достроен до магического квадрата. Но если я ввожу в программу последнего этапа показанный выше набор, программа мгновенно выдаёт готовый магический квадрат, вот этот:
Код:
1822 21226 682897 1446538 3003898 382
3004762 681817 778 2326 1446574 20506
1446142 2902 3004654 20542 346 682177
21262 1446178 1966 562 682393 3004402
94 3004618 1446106 682609 20974 2362
682681 22 20362 3004186 2578 1446934
Всё срабатывает абсолютно чётко!
Для меня в реализации этого алгоритма самым сложным и невыполнимым на Бейсике является второй этап – преобразование всех наборов из 4-х строк. Первый и третий этапы выполняются элементарно.
-- Пт окт 30, 2009 08:49:05 --И вот результаты тестирования алгоритма для квадрата Бодигрима порядка 5 из смитов.
Массив смитов, из которого построен квадрат:
Код:
4, 22, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 382, 391, 454, 483, 517, 526, 562, 634, 645, 663, 762, 825
Из данного массива программа генерирует всего 236 строк, состоящих из 5 чисел, так что сумма чисел в каждой строке равна магической константе квадрата -
.
Вот начало файла, куда программа записывает все эти строки:
Код:
4 22 346 634 825
4 22 454 526 825
4 22 517 526 762
4 22 526 634 645
4 58 382 562 825
4 85 346 634 762
4 85 355 562 825
4 85 391 526 825
4 85 454 526 762
4 85 517 562 663
4 94 274 634 825
4 94 346 562 825
4 94 382 526 825
4 94 391 517 825
4 94 454 517 762
4 94 454 634 645
4 94 526 562 645
4 121 319 562 825
4 121 355 526 825
4 121 382 562 762
4 121 517 526 663
4 166 202 634 825
. . . . . . . . . . . . . . . . .
Среди всех наборов из 3-х строк, составляемых на первом этапе, должен быть получен такой набор:
Код:
4 166 265 634 762
85 346 355 382 663
94 121 454 517 645
На следующем этапе из показанного набора из 3-х строк должен быть получен такой вариант:
Код:
4 166 634 762 265
382 346 663 355 85
645 517 454 121 94
Совершенно очевидно, что такой вариант получается из первоначального набора только перестановкой чисел в строках, строки в этом случае не переставлены.
Переходим к последнему этапу. Для квадрата 5-го порядка остаются свободными 10 чисел, и варьировать надо всего два элемента - I, J:
Код:
4 166 634 762 265
382 346 663 355 85
645 517 454 121 94
X X X X X
I X X X J
Понятно, что если мы придём к последнему этапу с показанным набором из 3-х строк, магический квадрат обязательно будет построен, вот такой:
Код:
4 166 634 762 265
382 346 663 355 85
645 517 454 121 94
526 483 58 202 562
274 319 22 391 825
Следует отметить, что данный алгоритм идеально подходит для проверки кандидатов в магические квадраты порядков 5 и 6 из последовательных смитов. Для квадратов из произвольных смитов сложность в том, что мы не знаем, из какого массива будет составлен магический квадрат и поэтому нам придётся проверять много разных массивов.
Уважаемые участники! Большая просьба: напишите, как поняли алгоритм, как оцениваете его эффективность и возможности для реализации. Спасибо.