Rabu, 12 Januari 2011

Magic Square.cpp

Berikut adalah source program Magic Square. Pasti udah tau kan Magic Square itu apa'an. Magic Square adalah suatu permainan angka yang kalo kita jumlahkan secara diagonal, horizontal maupun vertikal akan menghasilkan angka yang sama. Berikut Sourcenya :


#include <iostream>
#include <iomanip>

using namespace std;

int ReadSquareSize();
void OddMagicSquare(int** matrix, int n);
void DoublyEvenMagicSquare(int** matrix, int n);
void SinglyEvenMagicSquare(int** matrix, int n);
void MagicSquare(int** matrix, int n);
int** CreateMatrix(int n);
void FreeMatrix(int** matrix, int n);

int main(int argc, char* argv[])
{
int i,n;
n = ReadSquareSize();

int** matrix = CreateMatrix(n);

MagicSquare(matrix, n);

// print the square
for(int i=0; i<n ;i++)
{
for(int j=0; j<n ; j++)
{
cout<<setiosflags(ios::left) << setw (5) << matrix[i][j];
}
cout<<endl;
}

FreeMatrix(matrix,n);

return 0;
}


int ReadSquareSize()
{
int x;
cout<<"Enter a positive integer square size of 3 or more: ";
while(1)
{
cin>>x;
if(x>=3)
{
return x;
}
else
{
cout<<"Enter a positive integer square size of 3 or more: ";
}
}
cout<<endl;
}

void MagicSquare(int** 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(int** 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(int** matrix, int n)
{
int i, j;

int** I = CreateMatrix(n);
int** J = CreateMatrix(n);


//prepare I, J
int index=1;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
I[i][j]=((i+1)%4)/2;
J[j][i]=((i+1)%4)/2;
matrix[i][j]=index;
index++;
}

for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
if (I[i][j]==J[i][j])
matrix[i][j]=n*n+1-matrix[i][j];
}

FreeMatrix(I,n);
FreeMatrix(J,n);

}

void SinglyEvenMagicSquare(int** matrix, int n)
{
int i, j, k, index=0;

int p=n/2;

int** M = CreateMatrix(p);

MagicSquare(M, p);

for (i=0; i<p; i++)
for (j=0; j<p; 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;

int* I = new int[p];
int* J = new int[n];

for (i=0; i<p; i++)
I[i]=i+1;

k=(n-2)/4;

for (i=1; i<=k; i++)
J[index++] = i;

for (i=n-k+2; i<=n; i++)
J[index++] = i;

int temp;
for (i=1; i<=p; i++)
for (j=1; j<=index; 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;

FreeMatrix(M,p);
delete[] I;
delete[] J;

}


int** CreateMatrix(int n)
{
int i;
int** matrix = new int* [n];
for(i=0;i<n;i++)
{
matrix[i] = new int[n];
}
return matrix;
}


void FreeMatrix(int** matrix, int n)
{
for(int i=0; i<n ;i++)
{
delete[] matrix[i];
}
free(matrix);
}

Screenshoot :




MagicSquare




Baca Juga...



2 komentar:

Anonim mengatakan...

kalau ini menggunakan metode apa mas? runut balik atau gmn? terima kasih

Unknown mengatakan...

error: 'free' was not declared in this scope

Posting Komentar

.: Kritik & Saran sangat diharapkan untuk menjadi lebih baik ^.^ :.

Bookmark and Share
CopyRight © 2010 - 2011 by spyc0dz
=[ BorneoCrew ]=