传球问题图解

今天翻陈皓(http://coolshell.cn)前辈的博客,看到一些有意思的题目,比如这个:http://coolshell.cn/articles/1976.html

有a,b,c,d,四个人
互相传球
从a开始传出
经过5次传球后
球回到a的手里

算总共有多少种传球的方法

下面评论里面很多高手给出了排列组合公式的算法,无奈这方面学的不好,只好在纸上画了树状图来揣摩。

首先球在a手里,第一次传球a可以传给b,c,d三人。如果传给了b,那么第二次传球b可以传给a,c,d三人。我们把传球的情况画成如下的三叉树:


从树状图和下面的表格总结我们可以得出规律:

第N次传球后,球能够到达某人手里的方法数 == 第N-1次传球后,球不在某人手里的方法数 == 第N-1次传球后,球在其他人手里的方法数之和

例如:

两次传球后,球在a手里的方法数 = 一次传球后,球不在a手里的方法数 = 一次传球后,球在b,c,d手里的次数相加 = 1+1+1 = 3

两次传球后,球在c手里的方法数 = 一次传球后,球不在c手里的方法数 = 一次传球后,球在a,b,d手里的次数相加 = 0+1+1 = 2


具体表现在表格里面,也就是:下一排某个位置的数值,应该等于上一排除了该位置之外的其他位置相加之和。

例如:第三次的c位置的值 = 第二次的a,b,d之和 = 3+2+2 = 7。

所以:

经过5次传球后,回到a手里的方法数 = 4次传球后,球在b,c,d手里的方法数之和

= 4次传球后,球在b手里的方法数 + 4次传球后,球在c手里的方法数 + 4次传球后,球在d手里的方法数

= 3次传球后,球在a,c,d手里的方法数 + 3次传球后,球在a,b,d手里的方法数 + 3次传球后,球在a,b,c手里的方法数
=3次传球后 a + c + d + a + b + d + a + b + c = 3a + 2b + 2c + 2d = 18 + 14 + 14 + 14 = 60

知道求法之后,我们可以写代码实现,简单点可以写成递归调用,但是因为有重复计算所以会比较慢,要想时间和空间效率都比较好,就采用递推的方式,空间复杂度O(2n)。

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值