Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988153
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-23 15:53:04

比如 3 张椅子围成一圈,2 个人往上坐,只有1种排列
  ●
○●
  ○
●●
  ●
●○
上面三种排列只算一种,因为“圈”是无方向的,当然更假定所有椅子都是一样的,所有人也都是一样的。

5张椅子围成一圈,1 个人往上坐,有1种排列
5张椅子围成一圈,2 个人往上坐,有2种排列,一种是二个人靠一起,另一种是两个人之间隔一个空座
5张椅子围成一圈,3 个人往上坐,有2种排列,一种是三个人靠一起,另一种是两个人靠一起与另一人隔一个空座
5张椅子围成一圈,4 个人往上坐,有1种排列
……
6张椅子围成一圈,3 个人往上坐,有4种排列
   ○○
○      ●
   ●●
   ○●
○      ○
   ●●
   ●○
○      ○
   ●●
   ●○
○      ●
   ●○


……

把“空座“和“人”互换一下,并不会影响结果,所以人有几种排列,那么空座位就有几种排列。因此
f(m,n) 应当等于 f(m,m-n),这是最基本的,可以用它先过滤一下答案。

------ 2007-05-12日记

谢谢大家,我就不一个个回复了。

如果不是一个圈,而是一个排,那么这就非常简单:m! / (n!) / (m-n)!
如果是一个圈,自然会认为是 m! / (n!) / (m-n)! / m ,然而这是错误的,举例来说: 4张椅子2个人往上坐
如果是一个排,
有如下六种排列
●●○○
●○●○
●○○●
○●●○
○●○●
○○●●
按圈分,可以分成2组
●●○○
○●●○
○○●●
●○○●

●○●○
○●○●
,前4种在圈中属于同一种,后2种在圈中属于同一种,也就是每种排列的重复次数并不都相同,除以什么都不会正确,随着m和n越大,那些讨巧的做法,比如取绝对值呀,等等都将失效。


------ 2007-10-11 记 ------ 一个可能正确的答案: http://blog.vckbase.com/Files/bruceteen/permutation.zip

阅读(2061) | 评论(10) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 15:54:15

一刀
从下左展开2为110100
               3为110010
                    011001
                    101100
                    010110
                

网友评论2012-11-23 15:54:06

一刀
先用排列组合,把m个放n的所有情况算出来.
3椅子2个人是1->1->0, 1->0->1, 0->1->1
然后把每种情况放到一个循环链表中(汇编好像有循环移位.).循环,再和上面一个的值比较.
只要有一种情况和上面的一样.就删除.直到最后.
1->1->0,第一个不用建链表
1->0->1, 0->1->1,1->1->0(相等,删除)
0->1->1, 1->1->0,(相等,删除)
结果为1

网友评论2012-11-23 15:53:58

林杰杰
上面讲的不大对,反正思路好像是这样的。。。。

网友评论2012-11-23 15:53:49

林杰杰
突然想起。。。做这个题目的方法就是,
把它剪开,成为一条直线,然后这条直线上的算法就简单了。。。
然后把结果除以圆周的长度,就得出结果了。。。

高中的时候貌似做过这种题。。。

网友评论2012-11-23 15:53:39

小白
关于4张椅子2个人坐这样的问题可能复杂的多,我暂时除了穷举之外没有想到一个好的方法