2016-12-26 9 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

'value%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-venvenorder – samgak

答えて

1

は、私はあなたが意味することを引き受ける値をサポートするためにコードを変更する方法がわかりませんノーマルマジックスクエア(数字は1,2 ... n^2に制限されています)

まず、n = 2のマジックスクエアを構築することは不可能です。

第2に、完全に新しいアルゴリズムが必要です(これははるかに複雑です)。 のマジックスクエアの構築の偶数)はin this paperで解決されていますが、そこにはpsaudoコードはありませんが、説明からの実装はかなり簡単です(長いものですが)。

0

問題はここにある:あなたがインデックスに故意にいじっている

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

:どのように私はループの内側とその配列のインデックスとしてそれを作るデクリメント

i = 0; 
int j = n/2; 

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

外観配列

0

私はこの記事に基づいて私のアルゴリズムを完全に改訂したthis artcile で私の質問に答えを見つけました。後で結果のリストを掲示する