0
TechCake
Quote:
Originally Posted by Obaid
Admin, do you think this should be an Article because it does not work correctly
On that time i did'nt think for even order as raised ny Alramesh. I was working on that. but in these days i was busy so to give for even order may be late.

Quote:
Originally Posted by Obaid
as well as Nothing is explained.
Really i dont know how much explain of any topic should be. I think people will ask If intrested then i will explain.
0
Quote:
Really i dont know how much explain of any topic should be. I think people will ask If intrested then i will explain.
There is nothing personal against you but just my expectation from the Articles from this site is quite high. Look at some of the articles by Shabbir, Pradeep, bashamsc, Karpov2007 and they have code which is well commented and easy to understand even for a layman like me.
0
TechCake
Sorry to all of you for delayed ... Now this code will work for all order . I have tested on Unix/ solaris

Code:
```#include <vector>
#include<iostream.h>
using namespace std;
//There two series will be on even in case of magic square
// One of even order will be for multiple of 4
void BuildDoublyEvenMagicSquare(vector<vector<int> > &mat, int Order);
//Other of even order will be for multiple of 2
void SinglyEvenMagicSquare(vector<vector<int> > &mat, int order);
// For odd order
void BuildOddMagicSquare(vector<vector<int> > &mat, int Order);

// For odd order
void BuildOddMagicSquare(vector<vector<int> > &mat, int Order)
{
int SqrOfOrder = Order * Order;
int start=0, mid=Order/2;     // start position
for (int loop=1; loop<=SqrOfOrder; ++loop)
{
mat[start--][mid++] = loop;
if (loop % Order == 0)
{
start += 2;
--mid;
}
else
{
if (mid==Order)
mid -= Order;
else if (start<0)
start += Order;
}
}
}

void BuildDoublyEvenMagicSquare(vector<vector<int> > &mat, int Order)
{
vector<vector<int> > A(Order, vector<int> (Order, 0));
vector<vector<int> > B(Order, vector<int> (Order, 0));
int i, j;
//Building of matrixes I and  J
int index=1;
for (i=0; i<Order; i++)
for (j=0; j<Order; j++)
{
A[i][j]=((i+1)%4)/2;
B[j][i]=((i+1)%4)/2;
mat[i][j]=index;
index++;
}
for (i=0; i<Order; i++)
for (j=0; j<Order; j++)
{
if (A[i][j]==B[i][j])
mat[i][j]=Order*Order+1-mat[i][j];
}
}

void BuildSinglyEvenMagicSquare(vector<vector<int> > &mat, int order)
{
int ho=order/2;

vector<vector<int> > C(ho, vector<int> (ho, 0));

// For Order is Odd
if (order%2==1)
BuildOddMagicSquare(C, order);

// For Order is Even
else
{
//For Order is Doubly Even Order
if (order % 4==0)
BuildDoublyEvenMagicSquare(C, order);
//For Order is Singly Even Order
else
BuildSinglyEvenMagicSquare(C, order);
}
int i, j, k;
for (i=0; i<ho; i++)
for (j=0; j<ho; j++)
{
mat[i][j]=C[i][j];
mat[i+ho][j]=C[i][j]+3*ho*ho;
mat[i][j+ho]=C[i][j]+2*ho*ho;
mat[i+ho][j+ho]=C[i][j]+ho*ho;
}
if (order==2)
return;

vector<int> A(ho, 0);
vector<int> B;

for (i=0; i<ho; i++)
A[i]=i+1;

k=(order-2)/4;
for (i=1; i<=k; i++)
B.push_back(i);

for (i=order-k+2; i<=order; i++)
B.push_back(i);

int temp;
for (i=1; i<=ho; i++)
for (j=1; j<=B.size(); j++)
{
temp=mat[i-1][B[j-1]-1];
mat[i-1][B[j-1]-1]=mat[i+ho-1][B[j-1]-1];
mat[i+ho-1][B[j-1]-1]=temp;
}
i=k;
j=0;
temp=mat[i][j]; mat[i][j]=mat[i+ho][j]; mat[i+ho][j]=temp;
j=i;
temp=mat[i+ho][j]; mat[i+ho][j]=mat[i][j]; mat[i][j]=temp;
}

int main()
{
int Order;
cout<<"Enter the order of square which you wanna: ";
cin>>Order;
vector<vector<int> > mat(Order, vector<int> (Order, 0));

// For order less than 3 is meaningless so printing error
if (Order<3)
{
cout<<" Order Of Square must be greater than 2";
return -1;
}

// For Order is Odd
if (Order%2==1)
BuildOddMagicSquare(mat, Order);

// For Order is Even
else
{
//For Order is Doubly Even Order
if (Order % 4==0)
BuildDoublyEvenMagicSquare(mat, Order);
//For Order is Singly Even Order
else
BuildSinglyEvenMagicSquare(mat, Order);
}

// Display Results

for (int i=0; i<Order; i++)
{
for (int j=0; j<Order; j++)
{
cout<< mat[i][j]<<"  " ;
}
cout<<endl;
}
return 0;
}```
0
Ambitious contributor
can you please try it out again and post it back,

i feel it was a good topic
0
Ambitious contributor
Quote:
Originally Posted by imrantechi
can you please try it out again and post it back,

i feel it was a good topic
Already explained!!! I dont think so that it should be post back.

Last edited by debleena_doll2002; 13Feb2008 at 15:10..
0
Contributor
0
Go4Expert Member
good one
0
Go4Expert Founder
0
Contributor
i feel its a nice article i suppose you can post back the one without any problems
0
TechCake
whatever i post in latter, It has no probs. just check it.