|
本帖最后由 天山草 于 2023-8-20 06:33 编辑
此问题也可以用 mathematica 编程来解决。
下面介绍两个具体程序。
程序一是 nny 网友写的:
- Clear["Global`*"];
- fun[list_] := Module[{a, p1, p2, p3, p4}, a = Insert[list, "走道", {{3}, {7}}];(*在第3、第7个位置前插入走道*)
- If[Or[a[[1]] == 1, a[[-1]] == 1], Return[False]];(*如果最左边最右边为1, 则返回错误*){p1, p2, p3, p4} = Flatten[Position[a, #] & /@ {1, 2, 3, 4}];(*获取1234的位置*)
- If[Abs[p1 - p2] != 1, Return[False]];(*如果1、2位置不相邻,则返回错误*)
- If[Or[a[[1]] == 3, a[[-1]] == 3], Return[False]];(*如果最左边最右边为3,则返回错误*)
- If[Or[a[[1]] == 4, a[[-1]] == 4], Return[False]];(*如果最左边最右边为4,则返回错误*)
- If[Abs[p3 - p4] == 1, Return[False]];(*如果3、4位置相邻,则返回错误*)
- Return[True](*都到这了,肯定返回True*)]
- a = Permutations[{1, 2, 3, 4, 5, 6, 7, 8}];(*生成所有可能*)
- b = Select[a, fun[#] &];(*只选择符合条件的情况*)
- Length[b](*统计个数*)
- b; (*去掉分号将逐个列出分配方案*)
复制代码
下面这个是按穷举法写的笨程序,程序虽笨但容易理解,也方便套用到其它的排列组合问题。
- a = Permutations[{1, 2, 3, 4, 5, 6, 7, 8}];
- b = {};
- Do[If[a[[k, 1]] != 1 && a[[k, 8]] != 1 && a[[k, 1]] != 3 && a[[k, 8]] != 3 && a[[k, 1]] != 4 && a[[k, 8]] != 4,
- If[{a[[k, 2]], a[[k, 3]]} != {1, 2} && {a[[k, 2]], a[[k, 3]]} != {2, 1} && {a[[k, 3]], a[[k, 4]]} != {3, 4} && {a[[k, 3]], a[[k, 4]]} != {4, 3} && {a[[k, 4]], a[[k, 5]]} != {3, 4} && {a[[k, 4]], a[[k, 5]]} != {4, 3} && {a[[k, 5]], a[[k, 6]]} != {3, 4} && {a[[k, 5]], a[[k, 6]]} != {4, 3},
- If[{a[[k, 1]], a[[k, 2]]} == {2, 1} || {a[[k, 7]], a[[k, 8]]} == {1, 2} || {a[[k, 3]], a[[k, 4]]} == {1, 2} || {a[[k, 3]], a[[k, 4]]} == {2, 1} || {a[[k, 4]], a[[k, 5]]} == {1, 2} || {a[[k, 4]], a[[k, 5]]} == {2, 1} || {a[[k, 5]], a[[k, 6]]} == {1, 2} || {a[[k, 5]], a[[k, 6]]} == {2, 1},
- b = b~Join~{a[[k]]}]]], {k, 8!}];
- Length[b](* 座位分配方案数 *)
- b; (*去掉分号将逐个列出分配方案*)
复制代码
两种程序运行结果都是 2208。 |
|