2016-12-26 3 views
1

Этот код, который работает только для нечетных N. Проблема в том, что нет никаких идей, как добавить поддержку для четных значений NДоработка магический квадрат генератор

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int main() 
{ 
    setlocale(0, ""); 
    int n; 
    cout << "Enter the size of the magic square - "; 
    cin >> n; 

    int **matrix = new int *[n]; 
    for (int i = 0; i < n; ++i) 
    { 
     matrix[i] = new int[n]; 
    } 

    int nsqr = n * n; 
    int i = 0, j = n/2; 

    for (int k = 1; k <= nsqr; ++k) 
    { 
     matrix[i][j] = k; 
     i--; 
     j++; 
     if (k % n == 0) 
     { 
      i += 2; 
      --j; 
     } 
     else 
     { 
      if (j == n) 
      { 
       j -= n; 
      } 
      else if (i < 0) 
      { 
       i += n; 
      } 
     } 
    } 

    cout << "\n\nMagic square size - " << n << "\n\n"; 
    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      cout << matrix[i][j] << "\t"; 
     } 
     cout << endl; 
    } 

    for (i = 0; i < n; i++) 
     delete[] matrix[i]; 
    delete[] matrix; 

    system("pause >> null"); 
    return 0; 
} 

Я был бы признателен за советы по устранению неисправностей.

Если я не ошибаюсь, проблема в этой строке:

int i = 0, j = n/2; 

Но я не знаю, как изменить код, чтобы поддерживать даже значения

+0

Проверьте четные значения, используя 'значение% 2 == 0'. –

+0

Добро пожаловать в переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+0

Вам нужен совершенно другой алгоритм: http://math.stackexchange.com/questions/76411/how-to-construct-magic-squares-of-even-order – samgak

ответ

1

Я предположил бы, что вы имели в виду нормальный магический квадрат (где число ограничено 1,2..n^2)

Прежде всего, невозможно построить такой магический квадрат для n = 2.

2-й, для этого вам понадобится целый новый алгоритм, который намного сложнее. Проблема (построение магического квадрата для любого четного числа) решается in this paper и, хотя там нет никакого кода psaudo, реализация из объяснения довольно проста (хотя и длинная).

0

проблемы здесь:

i = 0; 
int j = n/2; 

for (int k = 1; k <= nsqr; ++k) 
{ 
    matrix[i][j] = k; 
    i--; 
} 

взгляда, как вы уменьшаете I внутри цикла и делаете его в качестве индекса массива так:

matrix[-3][j] = k; // will be in your code 

вы Мессинг намеренно с показателями массив

0

Я нашел ответ на свой вопрос в this artcile Я полностью пересмотрел свой алгоритм на основе этой статьи. Позже вывешивали итоговую программу

Смежные вопросы