Как создать магический квадрат в PHP?

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

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

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

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

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

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

Простую 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 последовательно. Здесь n – порядок Волшебной площади, скажем, 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

Вышеуказанные шаги применимы для любого порядка Волшебной площади!

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

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

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

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

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