传球游戏——递归算法

题目描述:
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
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值