1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

Magic Square

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

  1. asadullah.ansari

    asadullah.ansari TechCake

    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[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;
    		}
    	}
    }
    
     
    1 person likes this.
  2. alramesh

    alramesh New Member

    I think this will work only for odd Order.

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

    shabbir Administrator Staff Member

    Now I have a doubt as to for what it will work.
     
  4. debleena_doll2002

    debleena_doll2002 New Member

    I putted wrongly!!! It will work for only Odd Order...
    For even order it will not work.
     
  5. debleena_doll2002

    debleena_doll2002 New Member

    Can you delete my post
     
  6. shabbir

    shabbir Administrator Staff Member

    Done.
     
  7. debleena_doll2002

    debleena_doll2002 New Member

    Thanks Shabbir!!!
     
  8. coderzone

    coderzone Super Moderator

    Admin, do you think this should be an Article because it does not work correctly as well as Nothing is explained.
     
  9. shabbir

    shabbir Administrator Staff Member

    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. coderzone

    coderzone Super Moderator

  11. asadullah.ansari

    asadullah.ansari TechCake

    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. coderzone

    coderzone Super Moderator

    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.
     
  13. asadullah.ansari

    asadullah.ansari 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;
    }
    
    
     
  14. imrantechi

    imrantechi New Member

    can you please try it out again and post it back,

    i feel it was a good topic
     
  15. debleena_doll2002

    debleena_doll2002 New Member

    Already explained!!! I dont think so that it should be post back.
     
    Last edited: Feb 13, 2008
  16. lead.smart34

    lead.smart34 New Member

    please post the correct one
     
  17. crazytolearn57

    crazytolearn57 New Member

  18. shabbir

    shabbir Administrator Staff Member

  19. aisha.ansari84

    aisha.ansari84 New Member

    i feel its a nice article i suppose you can post back the one without any problems
     
  20. asadullah.ansari

    asadullah.ansari TechCake

    whatever i post in latter, It has no probs. just check it.
     

Share This Page