Índice de la sección dedicada a .NET (en el Guille) Cómo... en .NET

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
Actualizado el 21/Mar/2005
Autor: Guillermo 'guille' Som

 

Código para Visual Basic.NET (VB.NET)

Código para C Sharp (C#)

 

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=184

Ese 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:

 


Código para Visual Basic.NET (VB.NET)El código para VB .NET

 

'------------------------------------------------------------------------------
' 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

 


Código para C Sharp (C#)El código para C#

//-----------------------------------------------------------------------------
// 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");
    }
}

 


la Luna del Guille o... el Guille que está en la Luna... tanto monta...