Magic Square

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

  1. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    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[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

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

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

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    Now I have a doubt as to for what it will work.
     
  4. debleena_doll2002

    debleena_doll2002 New Member

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

    debleena_doll2002 New Member

    Joined:
    Feb 5, 2008
    Messages:
    119
    Likes Received:
    0
    Trophy Points:
    0
    Can you delete my post
     
  6. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    Done.
     
  7. debleena_doll2002

    debleena_doll2002 New Member

    Joined:
    Feb 5, 2008
    Messages:
    119
    Likes Received:
    0
    Trophy Points:
    0
    Thanks Shabbir!!!
     
  8. coderzone

    coderzone Super Moderator

    Joined:
    Jul 25, 2004
    Messages:
    736
    Likes Received:
    38
    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. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    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. coderzone

    coderzone Super Moderator

    Joined:
    Jul 25, 2004
    Messages:
    736
    Likes Received:
    38
    Trophy Points:
    28
  11. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    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. coderzone

    coderzone Super Moderator

    Joined:
    Jul 25, 2004
    Messages:
    736
    Likes Received:
    38
    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.
     
  13. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    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. imrantechi

    imrantechi New Member

    Joined:
    Feb 12, 2008
    Messages:
    116
    Likes Received:
    4
    Trophy Points:
    0
    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

    Joined:
    Feb 5, 2008
    Messages:
    119
    Likes Received:
    0
    Trophy Points:
    0
    Already explained!!! I dont think so that it should be post back.
     
    Last edited: Feb 13, 2008
  16. lead.smart34

    lead.smart34 New Member

    Joined:
    Feb 14, 2008
    Messages:
    77
    Likes Received:
    0
    Trophy Points:
    0
    please post the correct one
     
  17. crazytolearn57

    crazytolearn57 New Member

    Joined:
    Feb 14, 2008
    Messages:
    48
    Likes Received:
    0
    Trophy Points:
    0
  18. shabbir

    shabbir Administrator Staff Member

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
  19. aisha.ansari84

    aisha.ansari84 New Member

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

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    14
    Trophy Points:
    0
    Occupation:
    Developer
    Location:
    NOIDA
    whatever i post in latter, It has no probs. just check it.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice