PHP bir sihirli kare oluşturmak nasıl?

3 Cevap php

PHP bir sihirli kare (yani hepsi aynı değeri kadar ekleme numaralarının ızgara) oluşturmayı elimi denemek istiyorum, ama gerçekten nereden başlayacağımı bilmiyorum. Ben sonra her yineleme ile belirli bir yönde hareket eden, sabit bir pozisyonda "1" başlangıç ​​olarak sihirli kare, oluşturmak çok yöntem biliyorum. Ama ben hedefleyen kulüpler ne gerçekten randomize Sihirli Kare, yaratmaz.

Her satır ve sütun N kadar ekler (N ² +1) / 2 (örneğin, tüm satırlar / sütunlar 65 kadar eklemek bir 5x5 kare N ² sayı bir N-by-N Sihirli Kare oluşturmak mümkün olmak istiyorum - diyagonallere) önemi yok.

Herkes bir başlangıç ​​noktası sağlayabilir? Kimsenin benim için işi yapmak istemiyorum, ben sadece böyle bir projeyi başlatmak için bilmek gerekir?

Ben Java ile yazılmış bir jeneratör, (http://www.dr-mikes-math-games-for-kids.com/how-to-make-a-magic-square.html) biliyorum ama son Java deneyim Ben hızlı bir şekilde terk etmeden 10 yıl önce oldu vardı. Bu nedenle, ben gerçekten kod aslında ne yaptığını anlamıyorum. Ben yeni bir kare oluşturduğunuzda, bu (bir 5x5 kare için), sırayla, önce hızlı bir şekilde yeni bir randomize kare üreten sayıları 1-25 gösteriyor ki, fark etmedi.

3 Cevap

Wikipedia gibi siamese gibi sihirli kareler, üretmek için çeşitli algoritmalar vardır, eğer lütfen. Ama bu gerçekten rastgele sihirli kare değil dediğiniz gibi. Bu bir genetik algoritma başvuru yapar, bu konuda daha fazla bilgi bulmak olabilir mi acaba?

Başvurulan makalede tarafından kullanılan yöntem bazı akıllı matematik kullanarak, simulated annealing. Gerçek algoritma açıklamalarda izah edilmez ve ayrıntıları herhangi bir referans bulamıyor. Uygulama çekirdek çok az yöntemleri, diziler ve arithmentic neredeyse herhangi bir Java akıllılık - Ben, bunu anlamadan algoritması kopyalayan mevcut Java transkripsiyonu düşünebiliriz.

Bunu yapmak için basit bir Java programı, kolayca herhangi bir dilde yazılabilir:

/*
* 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(); 

Algoritma:

  1. Form a Square Matrix writing numbers 1 to nxn in sequence. Here n is the order of the Magic Square, say 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. We are trying to identify the final Matrix from the above. Form two matrices, one for identifying the row and another to identify the column.
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

You will see the middle column of the first Matrix starts with 1 and are in sequence. Columns on either side can be filled by subtracting and adding 1. The second Matrix is a mirror image.

  1. Form the final Matrix by writing the number from initial Matrix in the corresponding row and column. For e.g 4, 3 (Step 2) = 18 (Step 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

Yukarıdaki adımları Magic Square herhangi bir sipariş için geçerlidir!

Eğer özyineleme ile bu çözebilir gibi geliyor?

In my opinion: Start somewhere with a random number e.g. down right corner, than you start a function solve row, which calls itself until all rows are solved and a function solveField which calls itself until all fields in a row are placed correctly. (fills an array)

hiçbir kısıtlama 2 varsa yerler 1.. rastgele bir değişken solceField. satır tamamlamak için eksik numarası (bunu => toplamı üst üste kalan alanların daha büyük olamaz çok hızlı yüksekten yer olmadığını bir kontrol olmalı)

Eğer bir yerde takılırsanız eğer yanlış dönmek ve geri bir satır gitmek ve onun başında yeni bir rasgele değişken satır kokan.

Her şeyin doğru döner ve bir maqic kare elde edene kadar.