|
|
Mensaje: #1
Cuadrado Mágico
Un cuadrado mágico es una tabla donde se dispone de una serie de números enteros en un cuadrado o matriz de forma tal que la suma de los números por columnas, filas y diagonales principales sea la misma, la constante mágica. Usualmente los números empleados para rellenar las casillas son consecutivos, de 1 a n², siendo n el número de columnas y filas del cuadrado mágico.
El algoritmo usado por el código que les dejo a continuación sería el siguiente:
Código:
1º Colocamos el 1 en la mitad de la primera fila
2º colocamos el siguiente número en la casilla superior izquierda al último número que habíamos colocado
3º Repetimos paso 2 hasta que nos topemos con una casilla con un número. En tal caso, el siguiente número se colocaría en la casilla inferior al último número colocado.
4º Repetimos paso 2 y 3 hasta completar el cuadrado
Y aquí el código en c++:
Lenguaje C++
#include <iostream>
using namespace std;
const unsigned MAX = 100;
typedef int TArray[MAX][MAX];
struct TRegistro {
TArray cuadrado;
unsigned orden;
};
void pedirOrden(TRegistro& matriz);
void crearMagico(TRegistro& matriz);
void mostrarMatriz(const TRegistro& matriz);
int main () {
TRegistro matriz;
pedirOrden(matriz);
crearMagico(matriz);
mostrarMatriz(matriz);
return 0;
}
void pedirOrden(TRegistro& matriz){
bool bien = false;
int orden=0;
while (!bien) {
cout << "Introduzca el orden de la matriz(>1 e impar): ";
cin >> orden;
if ((orden>1) and (orden%2!=0)) {
matriz.orden = orden;
bien = true;
}
}
for (unsigned i=0; i<orden; i++) {
for (unsigned j=0; j<orden; j++) {
matriz.cuadrado[i][j] = 0;
}
}
}
void crearMagico(TRegistro& matriz){
int fila=0, columna, num=1;
columna = matriz.orden/2;
while (num<=matriz.orden*matriz.orden) {
matriz.cuadrado[fila][columna] = num;
num++;
fila--;
columna--;
if (columna<0) {
columna = matriz.orden-1;
}
if (fila<0) {
fila = matriz.orden-1;
}
if (matriz.cuadrado[fila][columna]!=0) {
fila += 2;
columna++;
if (columna>=matriz.orden) {
columna -= matriz.orden;
}
if (fila>=matriz.orden) {
fila -= matriz.orden;
}
}
}
}
void mostrarMatriz(const TRegistro& matriz){
for (unsigned i=0; i<matriz.orden; i++) {
for (unsigned j=0; j<matriz.orden; j++) {
cout << matriz.cuadrado[i][j] << "|";
}
cout << endl;
}
}
![[Imagen: moderadorglobal.png]](http://img832.imageshack.us/img832/3400/moderadorglobal.png)
(Este mensaje fue modificado por última vez en: 28-01-2012 10:57 PM por Sifaw.)
|
|
| 28-01-2012 10:55 PM |
|