小朋友传糖-递归算法

问题:

童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty  of  candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1  秒的时间,同一个小朋友不会重复接受糖果。由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要m秒的时间。那么,如果第一秒C小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?

思路:

一个小朋友吃糖时间为m s,传糖时间为1 s,并且是边吃边传。我们可以将它们分开,先吃糖后传糖,就变成了吃糖时间为m-1 s,在传糖1 s。

过程:

假设我们有四个小朋友,他们编号为:1,2,3,4,他们彼此站位是:4  3  2  1。3号小朋友先传糖给4号和2号,2号再给1号。

总时间 t = m-1+1+m-1+1+m-1=3*m-1 (2号和4号同时吃糖)

代码:

#include<iostream>

using namespace std;
int t=0;
int abc(int a[][2],int *h,int n,int p,int m,int C)  //关系  吃糖记录  人数  关系个数  吃糖时间  传糖的人
{
    int temp=0;
    h[C]=1;    //吃糖
    t=t+m;       //吃糖时间
    for(int i=1; i<=p; i++)
    {
        if(a[i][0]==C && h[a[i][1]]!=1)    //传糖的人并且被传糖的人没有吃过糖
        {
            temp++;
            abc(a,h,n,p,m,a[i][1]);        //传糖
        }
        else if(a[i][1]==C && h[a[i][0]]!=1)
        {
            temp++;
            abc(a,h,n,p,m,a[i][0]);
        }
    }
    if(temp!=0)
    {
        t++;
    }
    if(temp>1)
    {
        t-=m;
    }
    return -1;
}
int main()
{
    int n,p,c;    //小朋友数 关系数 c小朋友编号
    int m;        //吃糖时间
    cin>>n>>p>>c;
    cin>>m;
    int h[1000]={0};       //小朋友
    int a[1000][2];        //关系
    for(int i=1; i<=p; i++)   
    {
        cin>>a[i][0]>>a[i][1];
    }
    abc(a,h,n,p,m-1,c);
    cout<<t;
    return 0;
}

 

原文地址:https://www.cnblogs.com/xxaf/p/12793474.html