题目描述:
N个同学围一圈,同学之间可以左右传球,A为第一位同学,有多少种传球方法,在****传M次后回到A同学手中? 输出情况数 输入人数n、传球次数m
例如:N=3 M=3 假设为 1-2-3 个同学围一圈 ,
有两种可能:1->2->3->1 1->3->2->1
像这种有几种情况的题基本都要用到递归,或者递推、动态规划等
1、方法一:递归
分三种情况:
1. 球在第一个人手里 可以传2 或者传n
2. 球在最后一个人手里 可以传1 或者n-1
3. 球在中间的人的手里 传 k-1 或 k+1
int sum=0;
int m=0,n=0;
void dfs(int k,int step)
{
if(step==m) //传了m步 递归出口
{
if(k==1) //如果传了m次球回到第一个人手中 算一次 k代表球在第几个人手中
sum++;
return;
}
//一直递归 列出每一种符合情况的个数 即每一种step=m&&k=1的情况
if(k==n) //球在第n个人手里
{
dfs(1,step+1);
dfs(k-1,step+1);
}
if(k==1) //球在第一个人手里
{
dfs(n,step+1);
dfs(2,step+1);
}
if(k