• 一道游戏设计趣题


    题目

    前两天好基友乘坐飞机去外地开年会,估计公司怕他们坐飞机实在太无聊,给他们搞了几道思考题。

    在此我分享一下这道题目,以及答题思路。请先看题目内容。我直接上图片了,真的懒得打字呀~~~。

    接下来分享一下解题思路:

    首先想到的是最直接的方法,找出各种分类,并累加各种分类模式的总数即可。

    对于5种兵种,其形式可分为:

    1 1 1 1 1 (阵容为一样一个)     对此形式总数为 1 ,从5个兵种中取出5个兵种, 组合数为C55.

    5             (阵容为同一兵种)     对此形式总数为5 ,从5个兵种中取出1个兵种,组合数为C51.

    2 2 1       (2个某兵种,2个某其他兵种,1个某其他兵种) 对此形式总数为 30,组合数为C51 * C41 * C31 / 2. (这里需要除以2 ,要去除221中22引起的重复)

    2 3          (请脑补)对此形式总数为20,组合数为C51 * C41.

    1 4          (请脑补) 对此形式总数为20,组合数为C51 * C41.

    1 1 1 2    (请脑补)对此形式总数为20,组合数为C51 * C41 * C31 * C21 / 6.(这里需要除以6 ,要去除1112中111引起的重复)

    1 3 1       (请脑补)对此形式总数为30,组合数为C51 * C41 * C31 /2. (这里需要除以2 ,要去除131中1 1引起的重复)

    一共为 1 + 5 + 30 + 30 + 20 + 20 + 20 = 126.

    扩展

    理论上此题目已经解决,但是还没有抽取出可以扩展的规律。也就是说还有找到解决问题的通式。进一步思考,想到了高中时学习的插空法。嗯,可用此法优化解题思路。

    5个兵种槽位之间有4个空,插空即使将槽位进行分类。分类方式为插零个空C40(不分),插一个空C41(分成两部分),两个空C42(分成三部分),三个空C43(分成四部分),四个空C44(分成五部分)。

    以分成两部分为例:

    C41 * C52 :C52的意思为从5个兵种中任取2个兵种。将两个兵种分配到C41个槽模式下,总数为40.

    最终总数为:

    C40*C51 + C41*C52 + C42*C53 + C43*C54 + C44*C55 =  5 + 40 + 60 + 20 + 1 = 126  (1)

    再次扩展

    将组合式(1)进行如下变换得到组合式(2)

    C44*C51 + C43*C52 + C42*C53 + C41*C54 + C40*C55 (2)  

    组合式(2)可以缩写为  并可改写为C95,9 为(5 - 1) + 5 也就是槽数 -1 + 兵种数,5 为 兵种数。

    所以类似问题均可用一个组合数来表示。妙哉!~ 扩展公式为 n为兵种槽数,m为兵种数

     

    最后,我基友告诉我其实我推出了一个 公式。。。。

    允许重复组合

    还有一个巧妙的思路,可以直接得出C94的答案,在这里我就不介绍了,方法总比问题多,仅在这里抛砖引玉,如果错误请大家批评指正。谢谢。

  • 相关阅读:
    CSS3中的Transition属性详解
    jq 全选/取消效果
    多维数组问题 int (*a)[] int []
    C语言输入多组问题~ungetc回退字符到stdin
    2015-12-14重启博客之旅
    转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解
    lsof 一切皆文件
    转载自~浮云比翼: 不忘初衷,照顾好自己。
    转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
    梳理回顾
  • 原文地址:https://www.cnblogs.com/tangzhenqiang/p/8428280.html
Copyright © 2020-2023  润新知