题目描述

n个同学坐着围成一个圆圈,玩击鼓传花的游戏,每个同学只能把花传给左或者右边的同学。假如,当前花在小o手里,问传了m次以后,又回到小o手里的情况有多少种并输出。比如有3个同学1号、2号、3号,并假设小o为1号,花传了3次回到小o手里的方式有1->2->3->1和1->3->2->1,共2种。

解题思路

由于n人围成的是一个循环体,并且每个人都只可以往相邻的两个人的方向传递花。也就是说,每个人都往下一个人传时,都可以产生两种情况。同时传递次数会减去其1。由此,假设我们设定起点位置的编号为0,那么我们可以用一个二维数组dp来记录每个编号人员能够在多少次传递次数中传递到起点位置,其横向表示次数,纵向表示当前人员的编号。而我们针对两种情况可能出现序列个数的总和,做为我们的正解。我们可以得出这么一条方程:
dp[m][n] = dp[m-1][n-1] +dp[m-1][n+1]  
这个方程,其实就可以构成一种类递归结构。也是动态规划结构的初始模型,在这个问题上,我们进行进一步的完善:
1.结束条件
在这个问题上,并不是每种情况都会在次数用完之前回到原点,因此,我们需要对能够回到原点的行为进行标识。也就是,当可用次数为1时,距离起点0附近的两个节点(1 || n-1 )能够立刻返回至起点,也就是说
dp[1][1] = 1;
dp[1][n-1] = 1;
2.需要进行多少遍循环
我们需要探究的是每一次传递都会有哪些操作,也就是,我们需要确保每一次 次数的消耗 都需要知道他的情况,即左右两边的人在m-1次 次数下 到达起始点的个数。我们需要对每个编号人员及其次数进行遍历。因为次数引导编号,所以次数是活跃循环。因此,我们定义两个循环,外层循环遍历人员编号,内层则遍历次数。在这里需要注意的一个问题是,循环问题,也就是当n-1之后的左边人员会是0.因此需要进行处理。
综述:可得出以下状态转移方程,以i代表当前次数,j代表当前人员编号:
dp[i][j] = dp[i-1][(n-j-1)%n]+dp[i-1][(n-i+1)%n];

输入输入共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)输出输出共一行,有一个整数,表示符合题意的方法数

输入用例: 
3 3 
输出用例: 
2

代码实现

#include<stdio.h>
int dptest(int n,int m);
int main(void){
    int m,n;
    scanf("%d %d",&n,&m);
    int result = dptest(n,m);
    printf("%d\n",result);
    return 0;
}

int dptest(int n,int m){
        int dp[31][31];
        dp[1][1] = 1;
        dp[1][n - 1] = 1;
    for (int i = 2; i <= m; i++) {
        for (int j = 0; j < n; j++) {
            dp[i][j] = dp[i - 1][(n-j-1) % n] + dp[i - 1][(n-j+1) % n];
        }
    }
    return dp[m][0];
}       
--------------------- 
作者:明立 
来源:CSDN 
原文:https://blog.csdn.net/dengminghli/article/details/77619543 
版权声明:本文为博主原创文章,转载请附上博文链接!

击鼓传花---c语言实现相关推荐

  1. 击鼓传花c语言编程题,c语言-第5章 循环程序设计.ppt

    <c语言-第5章 循环程序设计.ppt>由会员分享,可在线阅读,更多相关<c语言-第5章 循环程序设计.ppt(83页珍藏版)>请在人人文库网上搜索. 1.第5章 循环程序设计 ...

  2. 击鼓传花c语言编程题,课程策划方案.doc

    课程策划方案 课程策划方案 课程策划方案(一):校本课程策划书 2012\2013年校本课程策划书 课程名称:少儿五子棋: 教学目标: 养成能静的习惯,学棋后感觉注意力的集中时间有所提高,一般小孩只能 ...

  3. 击鼓传花击鼓次数相同c语言,击鼓传花

    游戏介绍:这是博客里流行的击鼓传花游戏,传给谁谁就得接着,否则就得挨罚.请认真对待,不要怕暴露隐私. 1.被点到名字的要在自己博客里写下自己的答案,然后去掉第一个问题,再加上一个问题,仍然组成4个问题 ...

  4. c语言----击鼓传花

    有n个小朋友一圈,从1号开始传递,每次传递3个人,拿到花的小朋友表演节目后退出. 如1-5个小朋友,从1号开始传花,表演次序为3号,1号,5号,2号,4号. 5个小朋友击鼓传花 //击鼓传花 #inc ...

  5. 击鼓传花击鼓次数相同c语言,JavaScript 实现击鼓传花游戏

    大家小时候应该都玩过击鼓传花(Hot Potato)的游戏吧! 一群小孩围成一个圆圈,把花尽快的传给旁边的人.某一时刻传花停止,这时花在谁手里,谁就退出圆圈结束游戏.重复此过程,直到剩下最后一个孩子, ...

  6. 击鼓传花击鼓次数相同c语言,击鼓传花游戏规则以及惩罚方法大全-七维卓越拓展...

    [击鼓传花],可能是大家从小到大玩得最多的一个集体游戏了,就是几个人围成一个圈坐在一起,鼓声响起来即开始传花,鼓声一停,花传到了谁的手上就由谁来表演节目. 一.游戏意义 1.由于"形势所迫& ...

  7. 算法记录:击鼓传花问题c语言实现

    题目描述 学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏.游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击 ...

  8. 击鼓传花问题——JS实现

    学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏.游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开 ...

  9. 数据结构之栈和队列以及如何封装栈和队列,栈和队列的实例(进制转换和击鼓传花)

    什么是数据结构? 不同的书对数据结构有不同的定义,例如: "数据结构是数据对象,以及存在于该对象的实例和 组成实例的数据元素之间的各种联系.这些联系可以通过定义相关的函数来给出." ...

最新文章

  1. ubuntu下安装与卸载软件方法
  2. C# DateTime 日期加1天 减一天 加一月 减一月 等方法(转)
  3. module_init 详解
  4. [转]JQuery.Ajax之错误调试帮助信息
  5. 边缘计算精华问答 | 火爆的边缘计算为何兴起?
  6. mysql connection_id 表锁的应用
  7. Css 3d轮播样式
  8. MFC 设置应用程序开机启动并设置运行路径
  9. 华为上半年手机销量_2020年上半年华为发布的新手机盘点
  10. html图片多tab切换代码,CSS实现Tab页切换实例代码
  11. 敏捷思维-架构设计中的方法学(12)Refactoring
  12. 快速解决低版本Xcode不支持高版本iOS真机调试问题
  13. python列表查找整数,在数组/整数列表中查找重复项
  14. pyspark分类算法之随机森林分类器模型实践【randomForestClassifier】
  15. centos7安装python2.6_centos7.2下yum和python重装问题及解决方法
  16. 封装kmalloc/malloc的一些小函数
  17. STM32—驱动GY85-IMU模块
  18. 原生js实现简单的svg编辑器
  19. 如何申请MSN帐号和所有MSN后缀邮箱申请
  20. 关于 Linux 中 signal 函数信号处理的讨论

热门文章

  1. java实现来电弹屏_屏信小编告诉你呼叫中心的来电弹屏有哪些功能
  2. The Rise of the Underground
  3. php选课系统(学生端)功能
  4. 苹果平板电脑:显示已停用;怎么样打开
  5. Go 中的循环依赖检测工具 —— go-cyclic
  6. 基于TCP的QQ聊天工具
  7. 【Python】爬虫进阶---西瓜视频地址获取
  8. 【BZOJ2246】[SDOI2011]迷宫探险【搜索】【概率DP】
  9. 读取SpringBoot(Spring)的配置信息,定义常量
  10. 海浪相关术语波高、浪高等