Ejercicios y practicas de programación: Cuadrado mágico de orden impar.

Ejercicios con solución prácticas resueltas de programación en c, El enunciado de las prácticas y ejercicios que se plantea es el siguiente:

especificar un número impar como constante y de esta forma crear lo que se denomina como un “Cuadrado Mágico”.



Un cuadrado mágico es una rejilla o cuadricula en la que se visualizan una cantidad impar de posiciones tanto en horizontal como en vertical, es decir 3×3, 5×5, etc. A continuación se rellenan las posiciones de dicha cuadricula empezando por el valor 1 y al terminar de rellenar la cuadricula se obtendrá que la suma tanto horizontal como vertical de una columna o fila suman los mismo.

Vuelvo a comentar que no es la única solución posible y que la forma de mejorar siempre estas prácticas es que aportéis vuestro granito de arena utilizando para ello los comentarios. Un saludo y gracias por vuestra visita.

/*
  CUADRADO MAGICO DE ORDEN IMPAR
  ===============================
  WWW.APRENDOENCASA.COM
  WWW.APRENDOENCASA.ES
Nuevos ejercicios de programación con solución propuestos por un lector del
blog www.aprendoencasa.com, en esta ocasión las prácticas resueltas a realizar
consiste en especificar un número impar como constante y de esta forma crear lo
que se denomina como un "Cuadrado Mágico", un cuadrado mágico es una rejilla o
cuadricula en la que se visualizan una cantidad impar de posiciones tanto en
horizontal como en vertical, es decir 3x3, 5x5, etc. A continuación se rellenan
las posiciones de dicha cuadricula empezando por el valor 1 y al terminar de
rellenar la cuadricula se obtendrá que la suma tanto horizontal como vertical
de una columna o fila suman los mismo. Volver a comentar que seguro que existen
otros tipos de soluciones a los ejercicios aquí propuestos y estaré agradecido
si queréis realizar algún tipo de comentario o plantear alguna solución nueva
al ejercicio resuelto que aquí se plantea.
*/
// Inclusión de librería a utilizar en el programa
#include <stdio.h>
#include <stdlib.h>
// Constantes a utilizar en el programa
#define CUANTOS 3
// Función principal del programa
int main(int argc, char *argv[])
{
    // Creación de la matriz que contendrá los números
    // esta matriz se crea utilizando la constante creada
    // anteriormente, se ha de tener en cuenta que para que
    // funcione correctamente el programa la matriz ha de ser
    // cuadrada y de orden impar
    int Matriz[CUANTOS][CUANTOS];
    // Variable a utilizar como contador de números
    int contador=0;
    // Variables a utilizar para determinar la posición x e y en la matriz
    // almacenar las posiciones y los limites de la matriz
    int x=0;
    int y=0;
    int vx=0;
    int vy=0;
    // Número de números que hay que contar y limites de la matriz
    int limite=CUANTOS*CUANTOS;
    int limitex = CUANTOS - 1;
    int limitey = CUANTOS - 1;
    // Inicializar los valores de la matriz a 0
    for( x=0 ; x<CUANTOS ; x++)
    {
       for( y=0 ; y<CUANTOS ; y++ )
         {
              Matriz[x][y] = 0;
        }
    }
    // Establecer la posición x e y inicial de la matriz donde almacenar
    // el primer numero siendo en la primera fila posición central
    x = CUANTOS / 2;
    y = 0;
    // El primer numero se sitúa en la casilla central de la fila
    // superior de la matriz, a continuación el siguiente numero se
    // sitúa en la diagonal arriba derecha, es decir una posición
    // de fila mas alta y una posición de columna a la derecha, en
    // caso de ya estar ocupada la casilla se sitúa el numero correspondiente
    // debajo de la casilla de donde se partía inicialmente, si al
    // desplazarse por la matriz se superan los limites por algún sitio
    // se entra a la misma por el lado contrario, es decir si nos pasamos
    // de posición por la parte derecha de la matriz se empieza por la parte
    // izquierda de la misma, y así en todos los sentidos.
    // Bucle que se ejecuta el numero de casilla que contiene la matriz
    for(contador=1;contador<=limite;contador++)
    {
       // Asignar la posición del numero en la matriz
        Matriz[y][x] = contador;
        // Guardar la posición actual
        vx = x;
        vy = y;
        // Aumentar la posición de x si sobrepasa el limite derecho
        // situarla en el limite izquierdo
        x++;
        if( x > limitex ) x = 0;
        // Disminuir la posición de y, ya que se pretende avanzar en
        // diagonal
        y--;
        if( y < 0 ) y = limitey;
        // Se comprueba si la posición ya esta ocupada por un numero
        // si es así se vuelve a la posición original y se resitúa el
        // numero justo en la casilla inferior
        if (Matriz[y][x]>0)
        {
            // La casilla esta ocupada y se asigna el numero en la
            // casilla situada justo debajo de la casilla de donde procedía
            x = vx ;
            y = vy +1 ;
        }
    }
    // Visualizar la matriz
    printf("\nCUADRADO MAGICO - WWW.APRENDOENCASA.COM\n");
    for( x=0 ; x<CUANTOS ; x++)
    {
         for( y=0 ; y<CUANTOS ; y++ )
         {
              printf("|%3d|",Matriz[x][y]);
         }
         printf("\n");
    }
    printf("\nGRACIAS POR SU VISITA - WWW.APRENDOENCASA.ES\n\n");
 system("PAUSE");
  return 0;
}

El resultado del ejercicio una vez ejecutado es el que se muestra en la siguiente imagen, la cual muestra el cuadrado mágico en acción relleno con los números :