猴子分

             问题描述:动物园里的n只猴子编号为1,2,......n,依次排成一队等待饲养员按规则分桃。动物园的分桃规则是每只猴子可分得m个桃子,但必须排队领取。饲养员循环的每次取出1个,2个,3个.....k个桃子放入筐中,由排在队首的猴子领取。取到筐中的桃子数为K后,又重新从1开始。当筐中桃子数加上队首猴子已经取得的桃子数不超过m时,队首的猴子可以全部取出筐中桃子。取得的桃子总数不足m个的猴子,继续到队尾排队等候。当筐中桃子数加上队首猴子已经取得的桃子数超过m时,队首的猴子只能取满m个,然后离开队列,筐中剩余的桃子由下一只猴子取出。上述分桃过程一直进行到每只猴子都分到m个桃子

实验任务:对于给定的n,k,m模拟上述猴子分桃过程。
数据输入:n,k,m分别表示猴子数,每次最多取k个桃子到筐中,每只猴子最终都分到m个桃子。
输出结果:将分桃过程中每只猴子离开队列的次序依次输出。
input:
5 3 4
output:
1 3 5 2 4

数据结构实验课3
首先想到用队列模拟猴子拿桃的过程,然后设置变量tem表示框里的桃,注意!!猴子如果没拿完,饲养员下一次是不放桃的,然后通过出队入队来模拟就OK啦

#include<iostream>
#include<malloc.h>
#define OVERFLOW -2
using namespace std;
typedef int ElemType;
typedef struct QNode{
 ElemType data;//猴子手中的桃的数量
 QNode *next;//指向下一只猴子 
 ElemType order;//记录猴子的顺序 
}QNode,*QueuePtr;
typedef struct{
 QueuePtr front;
 QueuePtr rear;
}LinkQueue;
QueuePtr p,q;//指向猴子的指针 
//构造一个队列 
int initQueue(LinkQueue &Q){
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
 if(!Q.front) exit(OVERFLOW);
 Q.front->next=NULL;
 return 1; 
}
//入队操作 
int Enqueue(LinkQueue &Q,ElemType e,ElemType i){
 p=(QueuePtr)malloc(sizeof(QNode));
 p->data=e;
 p->order=i;
 Q.rear->next=p;
 Q.rear=p;
 return 1;
}
//出队操作 
int Dequeue(LinkQueue &Q,ElemType &e,ElemType &i){
 if(Q.front==Q.rear)  return 0;
 p=Q.front->next;
 e=p->data;
 i=p->order;
 Q.front->next=p->next;
 if(Q.rear==p)  Q.rear=Q.front;//如果是修改最后一个元素,则修改rear指针 
 free(p);
 return 1;
}
int main(){
 int n,m,k;//猴子的个数,猴子桃子的总数,最多的分配个数 
 int t,kk,tem,oo;//放入框中的数量,框中的剩余桃子 ,出队的猴子的序号 
 cout<<"请输入猴子的个数"<<endl;
 cin>>n;
 cout<<"请输入猴子要桃子的个数"<<endl;
 cin>>m;
 cout<<"请输入分配个数"<<endl;
 cin>>k;
 LinkQueue Q;
 initQueue(Q);
 //依次入队
 int ord=1;
 t=1; 
 kk=1;//放入框中的数量 
 while(t<n+1){//四只猴子进入队伍 
  Enqueue(Q,0,t);
  t++;//最后t=4 
 }
 p=Q.front->next;
 tem=0;
 int flag=1;
 int e,i; 
// cout<<p->order<<endl; 
 while(Q.front!=Q.rear){//还有猴子 
  p=Q.front->next;
  if(kk>k) kk=1;
  if(flag) tem+=kk;//向框中放桃子 
  if(tem<=(m-p->data)){//全部拿走 
     Dequeue(Q,e,i);
     oo=i;                                   
       // cout<<oo<<" ";
      e+=tem;//拿走桃子
      if(e==m)//拿走的刚好出队 
   {  
      cout<<oo<<endl;
         tem=0;//框中剩余为0
      kk++; 
      flag=1; 
   } 
      else {
      Enqueue(Q,e,oo);//不够然后又排队 
      kk++; 
      tem=0;
       flag=1;
      } 
  }
  else if(tem>(m-(p->data))){//猴子没全部拿走 
    Dequeue(Q,e,i);
    oo=i;
    tem-=(m-e);//猴子拿走需要的桃子
    //num=40;//此时猴子已经满了40了 
    flag=0;
    cout<<oo<<endl;
   //   cout<<"shi"<<endl;
  } 
 } 
 return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值