小朋友传糖-递归算法
问题:
童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,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; }