请帮助我在Wolfram Mathematica中为魔术广场创建功能。我必须创建函数MagicSquare [n_],其输出是前n ^ 2个整数的sqare矩阵,并且每列,每行和对角线上的这些整数之和必须相同。请帮助我,我尝试了一天,但我失败了。我的学校作业需要这个。
答案 0 :(得分:0)
这是一种简单的蛮力方法。请注意,检查值m
是magic constant。
(将随机值设置为数组变量可以很好地使用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
答案 1 :(得分: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'将会大约永远运行。 :)