# Magic Square

Discussion in 'C++' started by asadullah.ansari, Feb 6, 2008.

Joined:
Jan 9, 2008
Messages:
356
14
Trophy Points:
0
Occupation:
Developer
Location:
NOIDA
This is very simple if you think in a simple manner.

A magic square is represented in a matrix form. May be all of you know this formula to satisfy magic square rule i.e. for size of matrix n*n sum of each row or column or diagonal should be n[n*n+1]/2.

means
for n=3 , sum(row or column or diag) = 15
for n=4 , sum(row or column or diag) = 34
for n=5 , sum(row or column or diag) = 65​
You can say here n is order of magic square.

Example: for order of magic square 4
``` 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 ```

Now Just think it in a programmitically way!!!
Code:
```void BuildMagicSquare()
{
int order=5,loop;
int MagicMat;
int SqrOfOrder = order * order;
int nCount=0, mid=order/2;
for(loop=1; loop<=SqrOfOrder ; ++loop)
{
MagicMat[nCount--][mid++] = loop;
if (loop % order == 0)
{
nCount += 2;
--mid;
}
else
{
if (mid==order)
mid -= order;
else if (nCount<0)
nCount += order;
}
}
}
```

1 person likes this.
2. ### alrameshNew Member

Joined:
Feb 5, 2008
Messages:
22
0
Trophy Points:
0
I think this will work only for odd Order.

means for n=1,3,5,7, etc

3. ### shabbirAdministratorStaff Member

Joined:
Jul 12, 2004
Messages:
15,326
377
Trophy Points:
83
Now I have a doubt as to for what it will work.

4. ### debleena_doll2002New Member

Joined:
Feb 5, 2008
Messages:
119
0
Trophy Points:
0
I putted wrongly!!! It will work for only Odd Order...
For even order it will not work.

5. ### debleena_doll2002New Member

Joined:
Feb 5, 2008
Messages:
119
0
Trophy Points:
0
Can you delete my post

6. ### shabbirAdministratorStaff Member

Joined:
Jul 12, 2004
Messages:
15,326
377
Trophy Points:
83
Done.

7. ### debleena_doll2002New Member

Joined:
Feb 5, 2008
Messages:
119
0
Trophy Points:
0
Thanks Shabbir!!!

8. ### coderzoneSuper Moderator

Joined:
Jul 25, 2004
Messages:
736
37
Trophy Points:
28
Admin, do you think this should be an Article because it does not work correctly as well as Nothing is explained.

9. ### shabbirAdministratorStaff Member

Joined:
Jul 12, 2004
Messages:
15,326
377
Trophy Points:
83
No. Because its a contribution and not a query and so it goes into the Article / Tutorial / Source code section. Now how well its explained will make it a contender for the Article of the month.

10. ### coderzoneSuper Moderator

Joined:
Jul 25, 2004
Messages:
736
37
Trophy Points:
28
Agreed

Joined:
Jan 9, 2008
Messages:
356
14
Trophy Points:
0
Occupation:
Developer
Location:
NOIDA
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.

Really i dont know how much explain of any topic should be. I think people will ask If intrested then i will explain.

12. ### coderzoneSuper Moderator

Joined:
Jul 25, 2004
Messages:
736
37
Trophy Points:
28
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.

Joined:
Jan 9, 2008
Messages:
356
14
Trophy Points:
0
Occupation:
Developer
Location:
NOIDA
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;
}

```

14. ### imrantechiNew Member

Joined:
Feb 12, 2008
Messages:
116
4
Trophy Points:
0
can you please try it out again and post it back,

i feel it was a good topic

15. ### debleena_doll2002New Member

Joined:
Feb 5, 2008
Messages:
119
0
Trophy Points:
0
Already explained!!! I dont think so that it should be post back.

Last edited: Feb 13, 2008
16. ### lead.smart34New Member

Joined:
Feb 14, 2008
Messages:
77
0
Trophy Points:
0
please post the correct one

17. ### crazytolearn57New Member

Joined:
Feb 14, 2008
Messages:
48
0
Trophy Points:
0
good one

18. ### shabbirAdministratorStaff Member

Joined:
Jul 12, 2004
Messages:
15,326
377
Trophy Points:
83
19. ### aisha.ansari84New Member

Joined:
Feb 13, 2008
Messages:
82
1
Trophy Points:
0
i feel its a nice article i suppose you can post back the one without any problems

Joined:
Jan 9, 2008
Messages:
356