Cuadrado Mágico 4×4 C++
#include
#include
#include
#define max 100
int magic[max][max];
clase HF //Cuadrado mágico
{
privado:
int n; //El número factorial del cuadrado mágico
int x,y; //El subíndice de la matriz, eje X y eje Y
int i ,j; / /Variable de bucle
int di,dx,dy; //Utilizada para cuadrados mágicos pares e impares
int oucs; > int temp; p>
public:
void Accept(); //Aceptar datos
void jshf() //Cuadrado mágico factorial impar
void souhf (); //Cuadrado mágico doble y par
void dsouhf(); //Cuadrado mágico simple y par
void operar(); combinación
void display(); //Mostrar resultados
};
void HF::accept() //Aceptar datos
{
cout<<"Por favor, introduce el número factorial n del cuadrado mágico: ";
cin >>n;
}
void HF::jshf() //Cuadrado mágico impar (2n+1) (método del péndulo continuo)
{
x=n/2,y=0; //X Y representa el eje numérico (establezca la esquina superior izquierda para (0, 0))
for (i=1;i<=n*n;i++)
{
magic[y][x ] =i; //Asignar valores a las cuadrículas x*y
if (i%n==0) //Hay un número en la esquina superior derecha, colóquelo debajo
y++;
else if (y==0) //Excede el límite superior
x++,y= n-1;
else if (x==n-1) //Excede el límite derecho
x=0,y--;
else ///Situación normal
x++,y--;
}
}
void HF::souhf() // Cuadrado mágico doble par (método de simetría)
{
for (x=0;x for (y=0;y if((x+y)%2==0) //Equivalente a marcar el libro con cuadros amarillos { magic [x][y]= -1; magic[x][n-y-1]= -1; magia[n-x-1][y]= -1 magia[n-x-1][n-y-1]= -1; } for(x=0;x for(y=0;y { oucs=x*n+y; //oucs es una constante par if(magic[x][y]== -1) //Asigna un valor al número marcado magic[x][y]=n*n-oucs else magic[x][y]=oucs+1; // Asignar valores a números no marcados } } void HF::dsouhf() //Orden único y par (2(2m+ 1)) Cuadrado mágico (método Stretch) { for (di=0;di<4;di++) //Bloqueo del cuadrado mágico { switch (di) { caso 0: //Un trozo de A en la esquina superior izquierda dx=0, dy=0 ; break; caso 1: //La pieza inferior derecha de B dx=n/2,dy=n/2; break; caso 2: //Un trozo de C en la esquina superior derecha dx=n/2,dy=0; break; caso 3: //La pieza inferior izquierda de D dx=0;dy=n/2; break; predeterminado: p> break; } x=(n/2)/2,y=0 // El número en la primera línea de 1/4 p> int nhsq; // 1/2 n al cuadrado nhsq=(n/2)*(n/2); for (i=1; i<=nhsq;i++)//Asigna un valor al cuadrado mágico par { magic[y+dy][ x+dx]=i+nhsq*di; p> if(i % (n / 2) == 0) //Hay un número en la esquina superior derecha y++ ; else if(y==0) //Cuando Cuando se excede el límite superior x++,y=n/2-1; else if (x == n / 2 - 1) //Cuando se excede el límite derecho x=0,y--; else //En circunstancias normales x++,y--; } p> } int nm; nm=(n / 2 - 1) / 2; for (j=1;j< nm+1;j++) //Intercambia los m números comenzando desde la segunda fila de A y D. J se refiere a la columna de la matriz p> { temp=magia[(n/2 )/2][j]; magia[(n/2)/2][j]= magic[(n/2+1)/2+n/2-1][j] ;//Da a la fila del medio en A, M números comenzando desde el segundo número (1/4 superior izquierdo) hasta D > magic[(n/2+1)/2+n/2-1][j]=temp; //Coloque M números (1/4 inferior izquierdo) en la fila central de D comenzando desde el segundo. número A } for (i=0;i { p> if(i==(n/2)/2) ////I me refiere a la fila de la matriz continue; //Si se alcanza el número del medio, salir del bucle p> for(j=0;j { temp = magic[i][j]; magia [i][j]=magia[n/2+i][j]; magia[n/2+i][j]=temp; } p> } for (i=0;i for (j =n-1;j>n-nm;j--) { temp=magic[i][j]; magia[i ][j]=magia[n/2+i][j]; magia[n/2+i][j]=temp; p> } } void HF::operate() { system("cls"); cout << setw(45)<<"La producción del cuadrado mágico"< cout < cout < cout < cout < cout < cout < int choice ; cout<<"Por favor, introduzca su elección:"; cin>>choice; if(choice==1) { aceptar(); //Llamar a los datos aceptados if (n%2==0 | |n<=0) cout < <"Error, ingresa un número impar positivo: "< else { j shf(); // Llamar al cálculo del cuadrado mágico factorial impar display(); // Llamar al resultado de visualización } } p> else if (choice == 2) { aceptar(); //Llamar a los datos aceptados if(n== 2) cout <<"2 cuadrado mágico no existe"< else { if(n %2== 1 || n<=0) cout <<"Error, ingresa un número par positivo:"< else if (n%4 ==0) p> { souhf(); // Llamar al cálculo del cuadrado mágico factorial par display() // Llamar a la pantalla resultado } else { dsouhf(); //Llamar al cálculo de cuadrados mágicos simples e pares factoriales display(); //Llamar para mostrar resultados } } } else if ( elección==0) cout <<"¡Esta ejecución ha finalizado! !"< else cout <<"Esta ejecución ha finalizado : El motivo es una entrada incorrecta"< } void HF::display() //Mostrar resultados { cout< for(i=0;i { for(j=0;j cout< cout< } } void main() { HF hf; reproducción de caracteres; replay='y'; while (replay='y') //Operación en bucle { hf.operate( ); cout< cin>>replay; cout< if(replay !='y') return ; } }