2010-05-05 6 views
3

Je voudrais essayer de créer un Magic Square en PHP (c'est-à-dire une grille de nombres qui correspondent tous à la même valeur), mais je ne sais vraiment pas par où commencer. Je connais les nombreuses méthodes qui créent un carré magique, comme le départ de "1" à une position fixe, puis le déplacement dans une direction spécifique à chaque itération. Mais cela ne crée pas un Magic Square vraiment aléatoire, ce que je vise. Je veux être en mesure de générer un carré magique N-par-N de nombres N² où chaque ligne et colonne totalisent N (N² + 1)/2 (par exemple un carré 5x5 où toutes les lignes/colonnes s'additionnent à 65 - les diagonales n'ont pas d'importance).Comment créer un carré magique en PHP?

Quelqu'un peut-il fournir un point de départ? Je ne veux pas que quelqu'un fasse le travail pour moi, j'ai juste besoin de savoir comment démarrer un tel projet?

Je connais un générateur, écrit en Java (http://www.dr-mikes-math-games-for-kids.com/how-to-make-a-magic-square.html) mais la dernière expérience Java que j'ai eue remonte à plus de 10 ans avant que je l'abandonne rapidement. Par conséquent, je ne comprends pas vraiment ce que le code est en train de faire. J'ai remarqué, cependant, que lorsque vous générez un nouveau carré, il montre les nombres 1-25 (pour un carré de 5x5), dans l'ordre, avant de générer rapidement un nouveau carré aléatoire.

+0

Lien intéressant: http://mathworld.wolfram.com/MagicSquare.html –

+4

Est-ce pour les devoirs? Si oui, vous devriez l'étiqueter ainsi. – jcolebrand

+2

Pourquoi les gens demandent-ils cela pour presque toutes les questions? Si c'était pour les devoirs, je l'aurais étiqueté comme tel. C'est juste pour deux de mes passe-temps: les puzzles et le développement web. – TerranRich

Répondre

2

Wikipedia a plusieurs algorithmes pour générer des carrés magiques, tels que siamese, s'il vous plaît. Mais comme vous le dites, ce n'est pas un carré magique vraiment aléatoire. Il fait référence à un algorithme génétique, se demander si vous pourriez trouver plus de détails à ce sujet?

La méthode utilisée par votre article référencé utilise des maths intelligentes, simulated annealing. L'algorithme réel n'est pas expliqué dans les commentaires et je ne trouve aucune référence aux détails. Je pourrais imaginer reproduire l'algorithme sans le comprendre, en transcrivant le Java existant - le noyau de la mise en œuvre est très peu de méthodes, de tableaux et d'arithmétique presque aucune intelligence de Java.

+0

En fait, en faisant un puzzle "Anagram Magic Square" (qui utilise un carré magique 5x5), j'ai trébuché sur quelque chose d'intéressant. Les numéros 1-5 étaient sur des rangées et des colonnes séparées, tout comme 6-10, 11-15, etc. Ensuite, ça m'a frappé ... puisque les diagonales n'auront pas d'importance (je veux essentiellement faire ma propre place magique) Anagrammes) Je pourrais utiliser la méthode siamoise, puis échanger des rangées et des colonnes au hasard! Je pense que ça marchera ... J'ai juste besoin de le mettre en pratique. – TerranRich

0

On dirait que vous pourriez résoudre cela avec récursion? À mon avis: Commencez quelque part avec un nombre aléatoire, par exemple. en bas à droite, que vous lancez une fonction résolvez la ligne, qui s'appelle elle-même jusqu'à ce que toutes les lignes soient résolues et une fonction solveField qui s'appelle elle-même jusqu'à ce que tous les champs d'une ligne soient placés correctement. (remplit un tableau)

solceField place 1. une variable aléatoire s'il n'y a pas de restrictions 2. le nombre manquant pour compléter une ligne (vous devriez avoir une vérification qu'elle ne place pas trop haut => somme peut ne pas être plus grand que les champs restants d'une rangée)

Si vous êtes coincé, vous retournez false et vous revenez d'une rangée et vous recommencez la ligne avec une nouvelle variable aléatoire au début.

Jusqu'à ce que tout soit vrai et que vous ayez un carré maqique.

3

Un programme Java simple pour ce faire, peut être facilement réécrite dans toutes les langues:

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

algorithme:

  1. forme un nombre d'écriture matrice carrée 1 à nxn en séquence. Ici n est l'ordre du Magic Square, disons 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. Nous essayons d'identifier la matrice finale de ce qui précède. Former deux matrices , une pour identifier la ligne et une autre pour identifier la colonne .
 
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 

Vous verrez la colonne du milieu de la première matrice commence par 1 et sont dans l'ordre. Les colonnes de chaque côté peuvent être remplies en soustrayant et en ajoutant 1. La deuxième matrice est une image miroir.

  1. Formez la matrice finale en écrivant le numéro de la matrice initiale dans la ligne et la colonne correspondantes. Pour par exemple 4, 3 (étape 2) = 18 (Etape 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 

Les étapes ci-dessus sont applicables à toute commande du carré magique!

+0

?? s'il vous plaît citer des sources pour votre algorithme, ou montrer pourquoi cela fonctionne –

+0

Cela ressemble à la solution à mon problème! Il a même l'avantage d'avoir les diagonales jusqu'à 65. : D – TerranRich

+0

Salut Jason, j'ai trouvé moi-même ces étapes pour résoudre le problème du carré magique. J'ai validé la solution en essayant des carrés magiques de taille que mon pc pouvait faire. Vous ne savez pas pourquoi cela devrait fonctionner? – chellash

Questions connexes