Cuadrado Mágico

Tomás Malón Melendo

/* Un “cuadrado mágico” de dimensión n es una tabla de n×n
números que contiene todos los números naturales del 1 al n^2,
dispuestos en n filas de n números cada una, de forma que la
suma de los números de cualquier fila, columna y diagonal es
siempre la misma. */

 

#include<iostream>
#define DIM 100
using namespace std;

void leerMatriz(int [][DIM],int );
void escribirMatriz(int [][DIM],int);
bool recorrerMatriz(int [][DIM],int,int );
bool estanTodos(int [][DIM],int );
bool sumaColumna(int [][DIM],int );
bool sumaFila(int [][DIM],int );
bool sumaDiagonal(int [][DIM],int );
bool esMagico(int [][DIM],int );

//Programa Principal.

int main(){

int v[DIM][DIM],n,i;

cout<<“Introduzca la dimension de la matriz: “;
cin>>n;
while(n>DIM){
cout<<“Introduzca la dimension de la matriz: “;
cin>>n;}

leerMatriz(v,n);
cout<<“La matriz introducida”<<endl<<endl;
escribirMatriz(v,n);
if(esMagico(v,n)==true)
cout<<endl<<“Es un Cuadrado Magico”;
else
cout<<endl<<“No es un Cuadrado Magico”;
}

//Funciones

void leerMatriz(int v[][DIM],int n)
{
int i,j;
cout<<“Introduzca la matriz: “;
for (i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>v[i][j];
}

void escribirMatriz(int v[][DIM],int n)
{
int i,j;
for ( i=1;i<=n;i++){
for( j=1;j<=n;j++)
cout<<v[i][j]<<” “;
cout<<endl;}
}

// Indica si un numero se encuentra en la matriz.

bool recorrerMatriz(int v[][DIM],int n,int i)
{
int k,j;
bool t=false;
for (k=1;k<=n;k++){
for(j=1;j<=n;j++){
if(v[k][j]==i && t==false)
t=true;}}
return t;
}

//Indica si todos los numeros del 1 a n^2 estan en la matriz.

bool estanTodos(int v[][DIM],int n)
{
int i;
bool t=true;
for(i=1;i<=n*n;i++){
if(recorrerMatriz(v,n,i)==false && t==true)
t=false;}
return t;
}

//Indica si todas las columnas suman lo mismo.

bool sumaColumna(int v[][DIM],int n)
{
int i,j,sum=0,sum1;
bool t=true;
for(i=1;i<=n;i++)
sum+=v[i][1];
for(j=2;j<=n;j++){
sum1=sum;
sum=0;
for(i=1;i<=n;i++)
sum+=v[i][j];
if(sum1!=sum && t==true)
t=false;}
return t;
}

//Indica si todas las filas suman lo mismo.

bool sumaFila(int v[][DIM],int n)
{
int i,j,sum=0,sum1;
bool t=true;
for(j=1;j<=n;j++)
sum+=v[1][j];
for(i=2;i<=n;i++){
sum1=sum;
sum=0;
for(j=1;j<=n;j++)
sum+=v[i][j];
if(sum1!=sum && t==true)
t=false;}
return t;
}

//Indica si las diagonales suman lo mismo.

bool sumaDiagonal(int v[][DIM],int n)
{
int i,j,k=1,sum=0,sum1=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
sum+=v[i][j];

for(i=n;i>=1;i–)
sum1+=v[i][k];
k++;

if(sum1==sum)
return true;
else
return false;
}

//Indica si la matriz introducida es un cuadrado magico.

bool esMagico(int v[][DIM],int n)
{
if(estanTodos(v,n)==true && sumaColumna(v,n)==true && sumaFila(v,n)==true && sumaDiagonal(v,n)==true)
return true;
else
return false;
}

Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s