asadullah.ansari's Avatar, Join Date: Jan 2008
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.
coderzone's Avatar, Join Date: Jul 2004
Team Leader
Quote:
Originally Posted by asadullah.ansari
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.
asadullah.ansari's Avatar, Join Date: Jan 2008
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;
}
imrantechi's Avatar, Join Date: Feb 2008
Ambitious contributor
can you please try it out again and post it back,

i feel it was a good topic
debleena_doll2002's Avatar
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..
lead.smart34's Avatar, Join Date: Feb 2008
Contributor
please post the correct one
crazytolearn57's Avatar, Join Date: Feb 2008
Go4Expert Member
good one
aisha.ansari84's Avatar, Join Date: Feb 2008
Contributor
i feel its a nice article i suppose you can post back the one without any problems
asadullah.ansari's Avatar, Join Date: Jan 2008
TechCake
whatever i post in latter, It has no probs. just check it.