题目 1610: 传球游戏
题目
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。
聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球的方法被视作不同的方 法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有3个同学1号、2号、3号,并假设小蛮为1号,球传了3次回到小蛮手里的方 式有1-> 2-> 3-> 1和1-> 3-> 2-> 1,共2种。
输入
共一行,有两个用空格隔开的整数n,m(3< =n< =30,1< =m< =30)。
数据规模和约定
100%的数据满足:3< =n< =30,1< =m< =30
输出
t共一行,有一个整数,表示符合题意的方法数。
样例输入
3 3
样例输出
2
解题思路
本题是动态规划的问题,假设传球次数为m次,有3为小朋友,则传球过程可以下表描述:
小朋友编号 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
传球次数 | 0 | 1 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 1 | 0 | 0 |
2 | 0 | 2 | 1 | 1 | 2 | 0 |
3 | 0 | 2 | 3 | 3 | 2 | 0 |
… | … | … | … | … | … | … |
m | 0 | a[m-1][0]+a[m-1][2] | … | … | … | … |
表格中的第0和5列是为了方便第1和4列的运算,第1-3列代表的是3位小朋友,而又考虑到“小朋友围成圈”,因此,加入第4列,以表示首尾相接、方便第3列的运算。
表中的数据表示,传球过程当中,经第i次传球后,第j位小朋友手上有球的不同传球方式的数目。
代码
#include<stdio.h>
int main()
{int n,m,i,j;scanf("%d %d",&n,&m);int a[m+1][n+3];//行代表第i次传球,列代表第j各小朋友for (i=0;i<=m;i++)for (j=0;j<(n+3);j++)a[i][j] = 0;a[0][1] = 1;//初始状态时,球在1号小朋友手上a[0][n+1] = 1;//环形,首尾一致,方便运算for (i=1;i<=m;i++)//m次传球{for (j=1;j<=(n+1);j++)a[i][j] = a[i-1][j-1]+a[i-1][j+1];a[i][1] = a[i][1]+a[i][n+1];a[i][n+1] = a[i][1];}printf("%d",a[m][1]);return 0;
}
错误思路:
递归遍历每一种可能性,时间超限。
#include<stdio.h>
long int num = 0;
void tb(int a[], int n, int m, int s){int b[n],c[n],i,temp;int left=0,right=0;if (m!=0)//还有m步可以消耗{if (s<m || (n-s)<m)//既可以向左也可以向右{if ((m-n+s)%2==0 || (m-s)%2==0)//除了要走的步子之外,剩余消耗的步骤是偶数才可以走到终点{left = 1;right = 1;}}if (s==m)//向左走只有一条路{left = 0;//不需要遍历了num++;}if ((n-s)==m)//向右走只有一条路{right = 0;num++;}if (left==1)//向左走{for (i=0;i<n;i++)c[i] = a[i];if (s==0)temp = n-1;elsetemp = s-1;c[s] = 0;c[temp] = 1;tb(c,n,m-1,temp);}if (right==1)//向右走{for (i=0;i<n;i++)b[i] = a[i];if (s==(n-1))temp = 0;elsetemp = s+1;b[s] = 0;b[temp] = 1;tb(b,n,m-1,temp);}}else if (s==0)num++;
}int main()
{int i,m,n,s = 0;scanf("%d %d",&n,&m);int a[n];a[0]=1;//表示球在a[0]手里,首位都代表初始有球的人for (i=1;i<n;i++)a[i] = 0;tb(a,n,m,s);printf("%ld",num);return 0;
}
题目 1610: 传球游戏相关推荐
- 传球游戏【NOIP2008普及组】
题目:传球游戏[NOIP2008普及组] 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里 ...
- 洛谷P1057 传球游戏(记忆化搜索)
点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:4 ...
- 动态规划——洛谷_P1057传球游戏
题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...
- 洛谷 1057——传球游戏(递推与递归二分)
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...
- P1057 传球游戏
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...
- 传球游戏(洛谷-P1057)
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的: n 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每 ...
- Java 算法 传球游戏
目录标题 题目描述 解题思路 代码 流程图 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手 ...
- 蓝桥杯 传球游戏 动态规划
题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...
- CodeVs 1148 传球游戏
CodeVs 1148 传球游戏 解题报告 by MPS ------------------ ...
最新文章
- 打不开_网页打不开,怎解?
- [转]centos5.2用memcache 来作PHP 的session.save_handler
- SQLServer中使用Split功能分割字符串
- Unix网络协议分析
- win10下,cmd可以运行java,却不能运行javac
- 斯坦福大学深度学习与自然语言处理第三讲:高级的词向量表示
- docker rabbitmq_一文看懂Rabbitmq,从安装到实战演练
- 前端httpd+keepalived加后端heartbeat+nfs+drbd实现httpd服务的高效应用及资源统一管理...
- SQL数据库高级查询命令(3)
- 合数分解质数c语言算法,合数分解成质数之和问题探究
- java 重载 调用指定_java 方法重载的时候,同一个类,父子类,调用哪个方法的问题...
- 计算机原理与编程设计,最优化计算机原理与算法程序设计
- mysql基础之视图、事务、索引、外键
- Cannot load driver ‘C:\Keil_v5\ARM\Segger\JL2CM3.dll 报错解决方法。
- Intellij IDEA--导入导出配置
- 微信小程序之tab切换效果
- Java SE Lesson22_ClassLoader
- w7 声音图标不见了
- 2021财院ACM选拔赛题解
- 史上最全vue优化方案