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) = 65You 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[5][5]; 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; } } }
Admin, do you think this should be an Article because it does not work correctly as well as Nothing is explained.
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.
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.
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.
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; }