此代码仅针对奇数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 :(得分:1)
我认为你的意思是普通魔术方(其数量限制在1,2..n ^ 2)
首先,为n = 2构造这样的魔方是不可能的。
第二,你需要一个全新的算法,这要复杂得多。问题(构建任何偶数的幻方)解决了in this paper,虽然没有任何psaudo代码,但是来自explenation的实现非常简单(虽然很长)。
答案 1 :(得分: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
你故意乱用数组的索引
答案 2 :(得分:0)
我在this artcile中找到了我的问题的答案 我根据这篇文章对我的算法进行了全面修订。后来发布了列出生成的程序