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