TSC999 发表于 2023-8-14 08:21:04

八个人坐成一排,满足条件的坐法有多少种? 编程求解。

本帖最后由 TSC999 于 2023-8-14 08:38 编辑



上图表示某客机上的一排座位,其中 A1 和 A8 是靠弦窗的座位,A2 与 A3 及 A6 与 A7 之间都是走道。
有八位旅客 1、2、3、4、5、6、7、8 要坐在这一排座位上,其中旅客 1、2、3、4 对座位有如下要求:
1 不靠弦窗坐(即不坐 A1 和 A8); 1 和 2 必须相邻,且 1 与 2 之间不能是走道(被走道隔开就不算相邻)。
3 与 4 都不靠弦窗坐,且 3 与 4 不能相邻(若被走道隔开也不算相邻,例如 3 坐A2 位时,4 可以坐在 A3 位)。
5、6、7、8四位旅客对座位没有要求,可随便分配。
问:共有多少种坐法? 有人算得共有 2208 种坐法,见 http://www.mathchina.com/bbs/forum.php?mod=viewthread&tid=2058075&extra=page%3D1
现在的问题是,如何用 mathematica (下简称 MMA)写一个程序来验证 2208 种坐法是否正确。

我想以 MMA 中的全排列指令 Permutations[{1, 2, 3, 4, 5, 6, 7, 8}] 为基础,从中筛选掉不符合要求的那些坐法,剩余的就是答案。但尚未折腾出一个成功的程序。

TSC999 发表于 2023-8-14 10:01:59

本帖最后由 TSC999 于 2023-8-14 11:36 编辑

按题目的要求,编程如下。运行结果是 2568,但这个结果有错,因为把每一种符合要求的排列情况打印出来观察,发现有不符合要求的排列出现。
Clear["Global`*"];
aa = Permutations[{1, 2, 3, 4, 5, 6, 7, 8}] ;
n = 0;
For[i = 1, i <= 8!, i++,
a = aa[];
b = a;
If[(1 != b[] &&1 != b[]) &&(3 != b[] &&
   3 != b[]) &&(4 != b[] &&4 != b[]),
If[(1 == b[] &&2 == b[]) || (1 == b[] &&
      2 == b[]) || (1 == b[] &&
      2 == b[]) || (1 == b[] &&
      2 == b[]) || (1 == b[] &&
      2 == b[]) || (1 == b[] &&
      2 == b[]) || (1 == b[] &&
      2 == b[]) || (1 == b[] &&2 == b[]),
   If[(3 ==
       b[]) || (4 ==
      b[] || (3 == b[] &&4 != b[]) || (4 == b[] &&
         3 != b[])) || (3 ==
      b[] &&(4 != b[] || (4 != b[]))) || (4 ==
      b[] &&(3 != b[] || (3 != b[]))) || (3 ==
      b[] &&(4 != b[] || (4 != b[]))) || (4 ==
      b[] &&(3 != b[] || (3 != b[]))) || (3 ==
       b[]) || (4 == b[]),
    n = n + 1]]];
]; Print["n = ", n];

nyy 发表于 2023-8-14 10:08:16

我只能建议你穷举法!

northwolves 发表于 2023-8-14 14:03:15

Length@Select,{v,Permutations@Range@8}],Length@SequencePosition[#,{1,2}]+Length@SequencePosition[#,{2,1}]==1&&Length@SequencePosition[#,{3,4}]+Length@SequencePosition[#,{4,3}]==0&&Length@Complement[{1,3,4},{#[],#[]}]==3&]

2208 是对的

northwolves 发表于 2023-8-14 14:04:45

不知道如何简化

nyy 发表于 2023-8-14 14:43:16

本帖最后由 nyy 于 2023-8-14 14:45 编辑

Clear["Global`*"];(*清除所有变量*)
fun:=Module[{aaa,p1,p2,p3,p4},
    aaa=Insert;(*在第3、第7个位置前插入走道*)
    If]==1,aaa[[-1]]==1],Return];(*如果最左边最右边为1,那返回错误*)
    {p1,p2,p3,p4}=Flatten&/@{1,2,3,4}];(*获取1234的位置*)
    If!=1,Return];(*如果12位置不相邻,则返回错误*)
    If]==3,aaa[[-1]]==3],Return];(*如果最左边最右边为3,那返回错误*)
    If]==4,aaa[[-1]]==4],Return];(*如果最左边最右边为4,那返回错误*)
    If==1,Return];(*如果34位置相邻,则返回错误*)
    Return(*都到这了,肯定返回True*)
]
aaa=Permutations[{1,2,3,4,5,6,7,8}];(*生成所有可能*)
bbb=Select&](*只选择符合条件的情况*)
ccc=Length(*统计个数*)


我的代码,简单容易懂

2208个结果

aimisiyou 发表于 2023-8-14 20:10:42

运行结果确实是2208种排法。

northwolves 发表于 2023-8-14 22:02:35

Length@Select,{v,Permutations@Range@8}],SequenceCount[#,{1,2}]+SequenceCount[#,{2,1}]==1&&SequenceCount[#,{3,4}]+SequenceCount[#,{4,3}]==0&&Intersection[{1,3,4},{First@#,Last@#}]=={}&]

TSC999 发表于 2023-8-15 11:44:25

2# 楼的程序错误在哪里?需要如何修改才能运行成功?

nyy 发表于 2023-8-15 12:59:23

TSC999 发表于 2023-8-15 11:44
2# 楼的程序错误在哪里?需要如何修改才能运行成功?

mathematica这种垃圾程序,连个好用的调试器都没有,调试起代码费劲死了。
所以没人对看你的代码感兴趣。唯一的好办法就是自己多写注释、多缩进、不层层嵌套了。

想调试代码,自己就去慢慢print函数debug吧
页: [1] 2
查看完整版本: 八个人坐成一排,满足条件的坐法有多少种? 编程求解。