1

请你帮我在 Wolfram Mathematica 中为幻方创建函数。我必须创建函数 MagicSquare[n_],它的输出是前 n^2 个整数的平方矩阵,并且每列、每行和对角线上的这些整数的总和必须相同。请帮助我,我尝试了几天,但失败了。我的学校作业需要这个。

4

2 回答 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 回答