解题思路:
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;
}


点赞(3)
 

0.0分

13 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论