今天在csdn论坛里面看到一个贴子说一了一个阿里的面试题,题目大概意思是这样
1.一个3X3(就像3阶魔方一样)的格子,现在你在正面的左上角顶点上,要走到背面的右下角(这里应该还是从前向后看的右
边)顶点上.
2.一次可以走任意格数,但是只能从前向后,从左向右,从上向下.
3.一共有多少种走法.
如下图.
最初的思路.
刚看到题我的思路就是走到正面的每一个格子有多少种走法,然后再去计算从正面的不同格子到背面格子走法.但是最后发现不同的格子走到终点格子路径都不同.而且出发不仅仅从正面开始,也可以从上面,左面,最后这个也不是乘以3的关系,因为左面,上面到终点格子上的走的方式也不相同.一下就陷入混乱中,不能有一定的规则.
我看着图,一边想,并且找到一条路径,最边沿的路径,先向右走三格,然后再向下走三格,最后再向前走三格,这样可以到达终点.其它路径还有很多,那有什么规律呢?就是向右,向下,向前都是走的三格,这里只要总和是三格即可,比如你先向右走一格,再向下走三格,再向前走三格,再向右走两格也是可以到的.也就是说只要向右走的总和为3,向下走的总和为3,向前走的总和为3就可以了.那么我们再来验证一下,看有没有可能出现不是3格的情况,我们多弯几次,但是发现题中只能按前向后,左向右,上向下走,所以只有为3的情况才可以.
那么现在就是把三种3格的不同组合进来就可以了.现在我们看从左向右3格的情况有多少种.也就是3的拆分,如下
1 1 1 //3可分成1和1和1 表示 一次走1格,三次
1 2 //3可分成1和2 表示 一次走1格,一次走2格
2 1
3
接下来就是有趣点的事情况了,也就是把从上向下和从前向后组合进去,并且这两种也是要总和为3格,这里我们不急,一步一步的来.后面两种拆分方法也是同上面4种情况.下面是组合情况
1.当从左向右为 1 1 1的情况下,这里我们用排列组合的方式,也就是从4个位置中插入后面两种走法情况,要求达到都是3格.
1.1 当其中一步走的是从上到下的情况,当然另外的就是从前到后了.结果为
C(4,1)*1*1
1.2 当其中两步走的是从上到下的情况
C(4,2)*2*2 (这里乘以2表示有两步走的有两种情况,走1格和走2格,走2格和走1格)
1.3 当其中三步走的是上到下的情况
C(4,3)*1*1
2.当为1 2的情况,同上面分析得出
C(3,1)*1*2
C(3,2)*2*1
3.当为2 1,同上
4.当为3的时候
C(2,1)*1*1
所以最后结为,把几种情况加起来
1.4+24+4=32
2.6+6=12
3.6+6=12
4.2
最后结果为58,(貌似我回贴计算出误,当时可能算错了,当时52),这个题目我不知道具体的答案,如有发现有误的地方可以回复交流.
这里是修改部分,昨天晚上在逛超市的时候,不知怎么突然觉得上面的方法还有情况没有列举完,上面的情况只是当从左向右的情况全部在排列中间的情况,因为我选空是n+1的方式,所以这里还应该考虑从左往右在前,从左往右在后的情况.那么后面结果还有
C(3,1)*1*2
C(2,1)*1*1
C(2,1)*1*1
C(1,1)*1*1
所以结果应该再加上 (6+2+2+1)*2=22,那最后结果应该58+22=80,如果还有问题后面再修改吧.
[2014-07-02修改]
这里我又要修改了一下,因为前面的全部错了,前面思考了这么多,最后发现简单的方法,而且之前的3格应该是2格才对,也就是说从左向右走两格,从上向下走两格,再前向后走两格就到终点了.
所以可以理解成6个位置放三种颜色的球,每种球两个,那么结果应该是 C(6,2)*C(4,2)就ok了
所以结果应该是15*6=90
[2014-07-03修改]
高潮后面总是结束,总结一下,其实这种没有什么总结的.
主要是那个插入的各种情况的分析,其实如果这个要写代码来计算可能比分析还要复杂点,好像那个题目就是叫填个空,也就是写程序来实现.