Cuadrado Mágico(Código o algoritmo para resolver el cuadrado mágico o cubo mágico o cuadrado de Lo Shu)Publicado el 21/Mar/2005
|
Aquí te muestro el código para mostrar los cuadrados mágicos de los números 3, 5, 7 y 9, aunque se pueden aceptar cualquier otro número, en ese caso tendrás que modificar las comprobaciones y ajustar los números mostrados.
Este código está basado en uno de C++ (Pro34.cpp) bajado de esta dirección:
http://www.elguruprogramador.com.ar/libreria_de_codigo/download.asp?id=184Ese mismo código, una vez convertido y optimizado, es el que he usado para hacer la versión de C que pedían en el concurso de la revista MQO digital del Instituto Gesem (es posible que este link solo esté disponible hasta el 30/Mar/05 que es la fecha tope para participar).
Cuando pase el 30 de Marzo de 2005, publicaré el código que hice, el cual lo pude reducir a 225 bytes, aunque sin tantas comprobaciones ni mensajes como en el código aquí mostrado, ya que tampoco es plan de dar demasiadas pistas, je, je.Para más información sobre los cuadrados mágicos, visita estas páginas:
'------------------------------------------------------------------------------ ' Cuadrado Mágico (21/Mar/05) ' ' ©Guillermo 'guille' Som, 2005 ' ' Para compilar como EXE: vbc /out:cuadradoMagicoVB.exe cuadradoMagico.vb '------------------------------------------------------------------------------ Option Strict On Option Explicit On Imports System Imports Microsoft.VisualBasic Public Class CuadradoMagico <STAThread> _ Shared Function Main(args As String()) As Integer ' se indicará el número a usar (sólo se admiten 3, 5, 7 y 9) Dim n As Integer If args.Length > 0 Then Try n = Integer.Parse(args(0)) Catch mostrarAyuda() return 1 End Try Else Console.Write("Escribe un número (3, 5, 7 ó 9) > ") Try n = Integer.Parse(Console.ReadLine()) Catch mostrarAyuda() return 1 End Try End If ' If (n Mod 2 <>1 OrElse n<3 OrElse n>9) Then mostrarAyuda() return 1 End If ' Dim f, c As Integer Dim M(n * n - 1) As Integer f = 0 c = n \ 2 For i As Integer = 1 To n * n M(f * n + c) = i If i Mod n = 0 Then f +=1 Else If f = 0 Then f = n - 1 Else f -= 1 End If If c = n - 1 Then c = 0 Else c += 1 End If End If Next ' c = 1 For f = 0 To n * n - 1 Console.Write("{0,3}",M(f)) If c >= n Then Console.Write(vbCrLf) c = 1 Else c += 1 End If Next return 0 End Function ' Shared Sub mostrarAyuda() Console.WriteLine("Solo se admite 3, 5, 7 ó 9") End Sub End Class
//----------------------------------------------------------------------------- // Cuadrado Mágico (21/Mar/05) // // ©Guillermo 'guille' Som, 2005 // // Para compilar como EXE: csc cuadradoMagico.cs //----------------------------------------------------------------------------- using System; public class CuadradoMagico { [STAThread] static int Main(string[] args){ // se indicará el número a usar (sólo se admiten 3, 5, 7 y 9) int n; if(args.Length > 0) { try { n = int.Parse(args[0]); } catch { mostrarAyuda(); return 1; } } else { Console.Write("Escribe un número (3, 5, 7 ó 9) > "); try { n = int.Parse(Console.ReadLine()); } catch { mostrarAyuda(); return 1; } } if((n%2!=1 || n<3 || n>9)) { mostrarAyuda(); return 1; } int f, c; int[] M = new int[n*n]; f = 0; c = n/2; for(int i = 1; i <= n*n; i++) { M[f*n+c] = i; if(i % n == 0) f++; else { if(f == 0) f = n-1; else f--; if(c == n-1) c = 0; else c++; } } c = 1; for(f = 0; f < n*n; f++) { Console.Write("{0,3}", M[f]); if(c >= n) { Console.Write("\n"); c = 1; } else c++; } return 0; } static void mostrarAyuda() { Console.WriteLine("Solo se admite 3, 5, 7 ó 9"); } }