Как создать магический квадрат в PHP? - PullRequest
3 голосов
/ 05 мая 2010

Я хотел бы попробовать свои силы в создании магического квадрата в PHP (то есть сетки чисел, которые все складываются в одно и то же значение), но я действительно не знаю, с чего начать. Я знаю о многих методах, которые создают магический квадрат, например, начиная с «1» в фиксированной позиции, затем перемещаясь в определенном направлении с каждой итерацией. Но это не создает действительно рандомизированный Магический Квадрат, к которому я стремлюсь.

Я хочу иметь возможность генерировать N-N-N магический квадрат чисел N², где каждая строка и столбец складывается в N (N² + 1) / 2 (например, квадрат 5x5, где все строки / столбцы складываются в 65 - диагонали не имеют значения).

Кто-нибудь может предоставить отправную точку? Я не хочу, чтобы кто-нибудь делал за меня работу, мне просто нужно знать, как начать такой проект?

Мне известен один генератор, написанный на Java (http://www.dr -mikes-math-games-for-kids.com / how-to-make-a-magic-square.html ), но последний опыт Java у меня был более 10 лет назад, прежде чем я быстро отказался от него. Поэтому я не совсем понимаю, что на самом деле делает код. Однако я заметил, что когда вы генерируете новый квадрат, он показывает числа 1-25 (для квадрата 5x5) по порядку, прежде чем быстро генерировать новый рандомизированный квадрат.

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Простая Java-программа для этого может быть легко переписана на любом языке:

/*
* Magic Square
*/

int order = 5;

for (int row = 0; row < order; row++) {
    for (int col = 0; col < order; col++) {
        int rowMatrix = (((order + 1) / 2 + row + col) % order);
        int colMatrix = (((order + 1) / 2 + row + order - col - 1) %
order) + 1;
        System.out.print(((rowMatrix * order) + colMatrix) + "\t");
    }
    System.out.println(); 

Алгоритм:

  1. Формируйте квадратную матрицу, записывая числа от 1 до nxn в последовательности. Здесь п порядок Магического Квадрата, скажем, 5.
1        2       3       4       5  
6        7       8       9      10
11      12      13      14      15
16      17      18      19      20
21      22      23      24      25
  1. Мы пытаемся определить окончательную Матрицу из приведенного выше. Форма вторая матрицы, одна для идентификации строки и другая для идентификации колонка.
4       5       1       2       3               3       2       1       5       4
5       1       2       3       4               4       3       2       1       5
1       2       3       4       5               5       4       3       2       1
2       3       4       5       1               1       5       4       3       2
3       4       5       1       2               2       1       5       4       3

Вы увидите, что средний столбец первой матрицы начинается с 1 и в последовательности. Столбцы с любой стороны можно заполнить вычитанием и добавление 1. Вторая матрица является зеркальным отображением.

  1. Сформируйте окончательную Матрицу, написав число из начальной Матрицы в соответствующая строка и столбец. Например, 4, 3 (шаг 2) = 18 (шаг 1)
18      22       1       10      14
24       3       7       11      20
5        9      13       17      21
6       15      19       23       2
12      16      25        4       8

Вышеуказанные шаги применимы для любого порядка Магического квадрата!

2 голосов
/ 05 мая 2010

В Википедии есть несколько алгоритмов для генерации магических квадратов, например, сиамские , если хотите. Но, как вы говорите, это не совсем случайный магический квадрат. Он ссылается на генетический алгоритм, не могли бы вы найти более подробную информацию об этом?

Метод, используемый вашей ссылочной статьей, использует некоторые умные математические вычисления, имитация отжига . Фактический алгоритм не объясняется в комментариях, и я не могу найти никаких ссылок на детали. Я мог бы представить себе репликацию алгоритма, не понимая его, расшифровывая существующую Java - ядро ​​реализации состоит в очень небольшом числе методов, массивов и арифметических данных, практически без какой-либо хитрости Java.

0 голосов
/ 05 мая 2010

Похоже, вы могли бы решить эту проблему с помощью рекурсии?

По моему мнению: начните где-нибудь со случайного числа, например в правом нижнем углу, чем запустить функцию решения строки, которая вызывает себя до тех пор, пока не будут решены все строки, и функцию solveField, которая вызывает себя, пока все поля в строке не будут размещены правильно. (заполняет массив)

solceField размещает 1. случайную переменную, если нет ограничений 2. пропущенное число для завершения строки (вы должны проверить, что слишком высокое слишком быстрое => сумма не может быть больше, чем в остальных строка)

если вы застряли где-нибудь, вы вернете false, вернетесь на одну строку назад и переделаете строку с новой случайной величиной в начале.

Пока все не вернется, и у вас не будет магического квадрата.

...