Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Magic Square Program (C++)

For those unfamiliar with the classic magic square algorithm: A magic square is a two dimensional array (n x n) which contains a numerical value between the values 1 and n^2 in each location. Each value may appear only once. Furthermore, the sum of each row, column and diagonal must be the same. The input should be odd as I am writing an odd magic square solution.


I have completed the problem but as of now it has an unknown bug (logic? output?) that has been vexing me for the past hour. The values that are output are very off mark. Any help would be very much appreciated:


#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
  int n;

  cout<< "Please enter an odd integer: ";
  cin>>n;

  int MagicSquare[n][n];


  int newRow,
  newCol;

  // Set the indices for the middle of the bottom i
  int i =0 ;
  int j= n / 2;

  // Fill each element of the array using the magic array
  for ( int value = 1; value <= n*n; value++ )
  {
     MagicSquare[i][j] = value;
     // Find the next cell, wrapping around if necessary.
     newRow = (i + 1) % n;
     newCol = (j + 1) % n;
     // If the cell is empty, remember those indices for the
     // next assignment.
     if ( MagicSquare[newRow][newCol] == 0 )
     {
        i = newRow;
        j = newCol;
     }
     else
     {
        // The cell was full. Use the cell above the previous one.
        i = (i - 1 + n) % n;
     }

  }


  for(int x=0; x<n; x++)
  {
     for(int y=0; y<n; y++)
         cout << MagicSquare[x][y]<<" ";
     cout << endl;
  }
}
like image 959
user533053 Avatar asked Dec 07 '10 01:12

user533053


2 Answers

You forgot to initialize your MagicSquare to contain all zeros:

  for(int i = 0; i < n; i++) {
    for(int j = 0; j < n; j++) {
      MagicSquare[i][j] = 0;
    }
  }

Thus this check will almost always fail:

if ( MagicSquare[newRow][newCol] == 0 ) {
   i = newRow;
   j = newCol;
}

As C/++ doesn't initialize them to 0 for you.

like image 136
Andreas Wong Avatar answered Oct 05 '22 22:10

Andreas Wong


#include<iostream.h>
#include<iomanip.h>
int main()
{
     int arr[25][25]={0};
     cout<<"Enter size(odd):";
     int size;
     cin>>size;
     int i=0,j=(size-1)/2,n=1;
     arr[i][j]=n;
     while(n<=size*size){
           i--;
           j--;
           if(i<0&&j>=0){
                i=size-1;
                arr[i][j]=n;
                n++;
          }else if(j<0&&i>=0){
                j=size-1;
                arr[i][j]=n;
                n++;
          }else if(i<0&&j<0){
                i=i+2;
                j=j+1;
                arr[i][j]=n;
                n++;
          }else if(arr[i][j]!=0){
                i=i+2;
                j=j+1;
                arr[i][j]=n;
                n++;
          }else{  
                arr[i][j]=n;
                n++;
          }
      }
      for(i=0,i<ize;i++){  
            for(j=0,j<size;j++){
                  cout<<setw(3)<<arr[i][j];
            }
            cout<<endl;
      }
      return 0;
  }
like image 23
Anurag Verma Avatar answered Oct 05 '22 23:10

Anurag Verma