本帖最后由 TSC999 于 2017-5-30 23:02 编辑
下面是用 mathematica 写的程序:- Clear["Global`*"];
- n = 0;
- n1 = 21; (* 蓝球总数 *)
- w = 1; While[w <= 70,
- c[8] = {1}; c[7] = {1, 1}; c[6] = {1, 1, 1}; c[5] = {1, 1, 1, 1};
- c[4] = {1, 1, 1, 1, 1};
- c[3] = {1, 1, 1, 1, 1, 1}; c[2] = {1, 1, 1, 1, 1, 1, 1};
- c[1] = {1, 1, 1, 1, 1, 1, 1, 1};
- aa = Permutations[{1, 1, 1, 1, 2, 2, 2, 2}];
- c[1] = aa[[w]];
- j = 1; While[j <= 7,
- i = 1; While[i <= 8 - j,
- If[Part[c[j], i] == Part[c[j], i + 1],
- c[j + 1] = ReplacePart[c[j + 1], 2, i]];
- If[Part[c[j], i] != Part[c[j], i + 1],
- c[j + 1] = ReplacePart[c[j + 1], 1, i]];
- i++]; j++];
- s = Tally[Join[c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8]]] ;
- s1 = s[[1]]; (* 共有多少个 1 *)
- If[s1[[2]] == n1, n = n + 1; Print[c[1]]]; (* 对称的图案不计入的方案数目 *)
- w++;
- ]
- If[n == 0, Print["无解!"], Print["n = ", n]];
复制代码 运行结果(对称的图案不计入):
{1,2,1,1,2,2,1,2}
{1,2,2,2,1,1,1,2}
n = 2
如果对称图形也计入,那么程序的最后几句要改成:- Join[c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8]];
- s1 = s[[1]]; (* 共有多少个 1 *)
- s2 = s[[2]];
- If[s1[[2]] == n1 || s2[[2]] == n1 , n = n + 1;
- Print[c[1]]];(* 对称的图案也计入的方案数目 *)
- w++;
- ]
- If[n == 0, Print["无解!"], Print["n = ", n]];
复制代码 这样,上述程序的运行结果将是:
{1,2,1,1,2,2,1,2}
{1,2,2,2,1,1,1,2}
{2,1,1,1,2,2,2,1}
{2,1,2,2,1,1,2,1}
n = 4
【说明】程序上述输出结果,说的是最底层的排列方法。底层一旦确定,上面各层就随之确定了。 |