博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
传球游戏(递推)
阅读量:4635 次
发布时间:2019-06-09

本文共 1339 字,大约阅读时间需要 4 分钟。

描述 

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).

输出

 输出每组数据的传球种数,一组数据输出占一行,结果在int范围内。

样例输入

3 3

7 10

样例输出

2

252

分析:设i为传球次数,第j个人拿到球,易得只有传了i-1次且球在第j个人相邻两个人之一的人手里,第i次才能传到j的手中。

a[i][j] = a[i-1][j-1] + a[i-1][j+1] (1<j<n)

a[i][j] = a[i-1][n] + a[i-1][j+1]      (j == 1)

a[i][j] = a[i-1][n-1] + a[i-1][1]  (j == n)

1 #include 
2 #include
3 using namespace std; 4 int main() 5 { 6 int n, m; 7 while (scanf("%d %d", &n, &m) != EOF) 8 { 9 int a[31][31] = {
0};10 a[0][1] = 1; 11 for (int i = 1; i <= m; ++i)12 for (int j = 1; j <= n; ++j)13 {14 if (j == 1)15 a[i][j] = a[i-1][n] + a[i-1][j+1];16 else if (j == n)17 a[i][j] = a[i-1][1] + a[i-1][n-1];18 else19 a[i][j] = a[i-1][j-1] + a[i-1][j+1];20 }21 printf("%d\n", a[m][1]);22 }23 system("pause");24 return 0;25 }

 

转载于:https://www.cnblogs.com/PegasusWang/archive/2013/01/21/2870426.html

你可能感兴趣的文章
Linux 文件系统及 ext2 文件系统
查看>>
jenkins ssl证书报错问题解决
查看>>
《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集
查看>>
C语言对mysql数据库的操作
查看>>
SQL Server 数据库备份
查看>>
INNO SETUP 获得命令行参数
查看>>
http编程学习(C#)
查看>>
DNN 数据访问策略 (转)
查看>>
Sublime Text 自动换行
查看>>
mybatis逆向工程配置文件怎么再偷懒(懒出天际)
查看>>
hdu1160FatMouse's Speed(DP)
查看>>
Codeforces Round #228 (Div. 1)B
查看>>
poj2420A Star not a Tree?(模拟退火)
查看>>
switch case
查看>>
crash
查看>>
ASP.NET MVC 4 (十三) 基于表单的身份验证
查看>>
Charles抓取https请求
查看>>
LAMP环境搭建
查看>>
C语言的变量的内存分配
查看>>
clientcontainerThrift Types
查看>>