Este es el codigo fuente. Esta en VisualC++. Espero que te sirva!
#include "stdafx.h"
#include
using namespace std;
void OddMagicSquare(vector > &matrix, int n);
void DoublyEvenMagicSquare(vector > &matrix, int n);
void SinglyEvenMagicSquare(vector > &matrix, int n);
void MagicSquare(vector > &matrix, int n);
void PrintMagicSquare(vector > &matrix, int n);
int main(int argc, char* argv[])
{
int n;
printf("Enter order of square: ");
scanf("%d", &n);
vector > matrix(n, vector (n, 0));
if (n<3)
{
printf("\nError: n must be greater than 2\n\n");
return -1;
}
MagicSquare(matrix, n);
//Print results
PrintMagicSquare(matrix, n);
return 0;
}
void MagicSquare(vector > &matrix,int n)
{
if (n%2==1) //n is Odd
OddMagicSquare(matrix, n);
else //n is even
if (n%4==0) //doubly even order
DoublyEvenMagicSquare(matrix, n);
else //singly even order
SinglyEvenMagicSquare(matrix, n);
}
void OddMagicSquare(vector > &matrix, int n)
{
int nsqr = n * n;
int i=0, j=n/2; // start position
for (int k=1; k<=nsqr; ++k)
{
matrix[i][j] = k;
i--;
j++;
if (k%n == 0)
{
i += 2;
--j;
}
else
{
if (j==n)
j -= n;
else if (i<0)
i += n;
}
}
}
void DoublyEvenMagicSquare(vector > &matrix, int n)
{
vector > I(n, vector (n, 0));
vector > J(n, vector (n, 0));
int i, j;
//prepare I, J
int index=1;
for (i=0; i
for (j=0; j
{
I[i][j]=((i+1)%4)/2;
J[j][i]=((i+1)%4)/2;
matrix[i][j]=index;
index++;
}
for (i=0; i
for (j=0; j
{
if (I[i][j]==J[i][j])
matrix[i][j]=n*n+1-matrix[i][j];
}
}
void SinglyEvenMagicSquare(vector > &matrix, int n)
{
int p=n/2;
vector > M(p, vector (p, 0));
MagicSquare(M, p);
int i, j, k;
for (i=0; i
for (j=0; j
{
matrix[i][j]=M[i][j];
matrix[i+p][j]=M[i][j]+3*p*p;
matrix[i][j+p]=M[i][j]+2*p*p;
matrix[i+p][j+p]=M[i][j]+p*p;
}
if (n==2)
return;
vector I(p, 0);
vector J;
for (i=0; i
I[i]=i+1;
k=(n-2)/4;
for (i=1; i<=k; i++)
J.push_back(i);
for (i=n-k+2; i<=n; i++)
J.push_back(i);
int temp;
for (i=1; i<=p; i++)
for (j=1; j<=J.size(); j++)
{
temp=matrix[i-1][J[j-1]-1];
matrix[i-1][J[j-1]-1]=matrix[i+p-1][J[j-1]-1];
matrix[i+p-1][J[j-1]-1]=temp;
}
//j=1, i
//i=k+1, k+1+p
i=k;
j=0;
temp=matrix[i][j]; matrix[i][j]=matrix[i+p][j]; matrix[i+p][j]=temp;
j=i;
temp=matrix[i+p][j]; matrix[i+p][j]=matrix[i][j]; matrix[i][j]=temp;
}
void PrintMagicSquare(vector > &matrix, int n)
{
for (int i=0; i
{
for (int j=0; j
printf(" %3d", matrix[i][j]);
printf("\n");
}
printf("\n\n");
}
2006-10-05 16:21:44
·
answer #1
·
answered by Pepe 8a 2
·
1⤊
0⤋
concuerdo con el alejandro
ah y yo hice eso en visual basic pero lastimosamente formatee la maquina asi que aunque quisiera no puedo ayudarte
2006-10-05 15:39:28
·
answer #2
·
answered by Als_Virus 6
·
0⤊
2⤋
Y te imaginás que alguien se va a poner a hacer semejante código solo para responder esto?? Por qué no te dedicás a la decoración de interiores y dejás la programación para gente que resuelve sus propios problemas en vez de pedir a los demás que lo hagan por vos..?
2006-10-05 13:32:00
·
answer #3
·
answered by Eneas 6
·
0⤊
2⤋