-3

I have a program that takes in a set of 16 numbers and prints them out in a grid of 4x4. I must then check each row, column and diagonal add up to the same number, however I can't do this part, as I have no idea how that would work. Can anyone help?

current code:

void getNumbers(int numbers[]){
int idx;
for(int x = 0; x < 17; x++){
    cout << "Please enter a number: " << endl;
    cin >> idx;
    numbers[x] = idx;
}
cout << " " << numbers[0] << " " << numbers[1] << " " << numbers[2] << " " << numbers[3] << endl;
cout << " " << numbers[4] << " " << numbers[5] << " " << numbers[6] << " " << numbers[7] << endl;
cout << " " << numbers[8] << " " << numbers[9] << " " << numbers[10] << " " << numbers[11] << endl;
cout << " " << numbers[12] << " " << numbers[13] << " " << numbers[14] << " " <<  numbers[15] << endl;
}
false
  • 10,264
  • 13
  • 101
  • 209
Thomas
  • 293
  • 1
  • 3
  • 15

3 Answers3

1

remove any syntax error if you see, the overall code must work! Enjoy ;-)

bool magicSquare(){
    int idx;
    int numbers[4][4];
    cout << "Please enter your numbers: " << endl;
    for(unsigned int i=0; i<4; i++) {
        for(unsigned int j=0; j<4; j++) {
            cin >> idx;
            numbers[i][j] = idx;
        }
    }
    // Checking 
    for(unsigned int i=0; i<4; i++) {
        int row_sum = 0;
        for(unsigned int j=0; j<4; j++) {
            row_sum+= numbers[i][j];
        }
        int col_sum = 0;
        for(unsigned int j=0; j<4; j++) {
            col_sum+= numbers[j][i];
        }
        int diag_sum_left = numbers[0][0] +  numbers[1][1] +  numbers[2][2];
        int diag_sum_right = numbers[0][2] +  numbers[1][1] +  numbers[2][0];
        if ((col_sum != 15) || 
            (row_sum !=15) ||
            (diag_sum_left != 15) ||
            (diag_sum_right != 15) )
            return false;
    }       
    cout << "Your answer is correct:" << endl;
    for(unsigned int i=0; i<4; i++) {
        for(unsigned int j=0; j<4; j++) 
            cout << numbers[i][j] << "\t";
        cout << endl;
    }       
    return true;
}
M0X2
  • 55
  • 1
  • 6
0

You can just write all the sums and the rules directly

Like this:

int horizontal1 = numbers[0]+ numbers[1]+ numbers[2]+ numbers[3];
int horizontal2 = numbers[4]+ numbers[5]+ numbers[6]+ numbers[7];
int horizontal3 = numbers[8]+ numbers[9]+ numbers[10]+numbers[11];
int horizontal4 = numbers[12]+numbers[13]+numbers[14]+numbers[15];

int vertical1 = numbers[0]+numbers[4]+numbers[8]+ numbers[12];
int vertical2 = numbers[1]+numbers[5]+numbers[9]+ numbers[13];
int vertical3 = numbers[2]+numbers[6]+numbers[10]+numbers[14];
int vertical4 = numbers[3]+numbers[7]+numbers[11]+numbers[15];

int diagonal1 = numbers[0]+numbers[5]+numbers[10]+numbers[15];
int diagonal2 = numbers[3]+numbers[6]+numbers[9]+ numbers[12];

// The result of check would be in this variable
bool result = horizontal1 == horizontal2 && 
              horizontal1 == horizontal3 &&
              horizontal1 == horizontal4 &&
              horizontal1 == vertical1 &&
              horizontal1 == vertical2 &&
              horizontal1 == vertical3 &&
              horizontal1 == vertical4 &&
              horizontal1 == diagonal1 &&
              horizontal1 == diagonal2;
43l0v3k
  • 337
  • 2
  • 9
  • 1
    While not *wrong*, this is not a very good way of solving it. A better approach would be a general purpose function(s) for summing the rows, columns, and diagonals. Furthermore, you can do lazy evaluation as you go, stopping at the first mismatched sum, to avoid having to do all the calculations in each case. – JBentley May 31 '14 at 21:01
0

Put how to check aside, you have something wrong in the posted code: You mentioned that you have 16 numbers but you are actually asking for 17. If your numbers array has size = 16, then you will have index out of bound error.

for(int x = 0; x < 17; x++){
            //^^^should be 16, put them into numbers array with numbers[0] to numbers[15]
    cout << "Please enter a number: " << endl;
    cin >> idx;
    numbers[x] = idx;
}

For checking, the brute force way is to check for rows,columns then diagonal separately.

taocp
  • 23,276
  • 10
  • 49
  • 62