请你帮我在 Wolfram Mathematica 中为幻方创建函数。我必须创建函数 MagicSquare[n_],它的输出是前 n^2 个整数的平方矩阵,并且每列、每行和对角线上的这些整数的总和必须相同。请帮助我,我尝试了几天,但失败了。我的学校作业需要这个。
问问题
579 次
2 回答
0
这是另一种适用于 n=3 的蛮力方法。
n = 3
m = n (n^2 + 1) /2
Select[
Partition[# , n] & /@
Permutations[Range[n^2]],
(Union @(Total /@ # )) == {m} &&
(Union @(Total /@ Transpose[#] )) == {m} &&
Total@Diagonal[#] == m &&
Total@Diagonal[Reverse@#] == m & ][[1]] // MatrixForm
这样做的好处是对于较大的 n 会立即产生内存不足错误,而 Chris' 将几乎永远运行。:)
于 2014-02-28T16:23:06.737 回答
0
这是一个简单的蛮力方法。注意检查值m
是魔术常数。
(将随机值设置为数组变量可以很好地使用HoldFirst
。)
n = 3;
m = n (n^2 + 1)/2;
check = {0};
While[Unequal[Union[check], {m}],
Clear[s];
x = Table[s[i, j], {i, 1, n}, {j, 1, n}];
d1 = Diagonal[x];
d2 = Diagonal[Reverse[x]];
cols = Transpose[x];
vars = Flatten[x];
rand = RandomSample[Range[n^2], n^2];
MapThread[Function[{v, r}, v = r, HoldFirst], {vars, rand}];
check = Total /@ Join[x, cols, {d1, d2}]];
MatrixForm[x]
8 3 4
1 5 9
6 7 2
于 2014-02-28T15:40:57.337 回答