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

歡迎來到Stack Overflow。請花些時間閱讀[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來說,構造這樣的魔方是不可取的。

第二,你需要一個全新的算法,它要複雜得多。這個問題(爲任何的偶數構建幻方)被解決in this paper,雖然那裏沒有任何psaudo代碼,但從完成的實現非常簡單(儘管長)。

0

的問題是在這裏:

i = 0; 
int j = n/2; 

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

看你怎麼減我的環內,使得它作爲數組的索引,以便:

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

您正在使用的索引故意搞亂陣列

0

我在我的問題找到答案this artcile 我做了基於這篇文章我的算法的完整版本。之後發佈列出所產生的程序