左嘉


私信TA

用户名:zuojia

访问量:70461

签 名:

Jz

等  级
排  名 3
经  验 31215
参赛次数 226
文章发表 72
年  龄 36
在职情况 在职
学  校 北京理工大学
专  业

  自我简介:

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

11 人评分

  评论区