原题链接:蓝桥杯算法训练VIP-传球游戏
解题思路:
n个同学,m次传球,定义成m行n列的数组f[m][n](m,n<=30),数组中的f[i][j](1<=i<=m,1<=j<=n)表示第i次传球给同学j的可能,第1次传球,1号只可能传给2号或n号,从第2次到第m次传球,是怎样传递到1号到n号的?只能通过相邻位置,也就是上次传球,已传到本次位置的左边或右边,本次把上次球传到相邻位置的可能方式加起来,就能计算出球传到当前位置的可能方式有几种。
注意事项:
站成圆圈传球,若球往左传,编号减少,左传到0时,加n修正,传到编号为n的同学;若球往右传,编号增加,右传到n+1时,减n修正,传到编号为1的同学。
参考代码:
#include <stdio.h> int n; int main(){ int at(int); int m,i,j,f[31][31] = {0}; scanf("%d%d",&n,&m); f[1][2] = f[1][n] = 1; //第1次传球,1号只可能传给2号或n号 for(i = 2;i <= m;i++) //从第2次到第m次传球 for(j = 1;j <= n;j++) //每次传给1号到n号的可能,取决于上次球传到相邻位置的可能 f[i][j] = f[i - 1][at(j - 1)] + f[i - 1][at(j + 1)]; printf("%d",f[m][1]); //第m次传球,传给1号的可能方式有几种 return 0; } int at(int x){ //站成圆圈传球 if(x<1) return x + n; //编号减少到0时,传到编号n if(x>n) return x - n; //编号增加到n+1时,传到编号1 return x; }
0.0分
13 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复