问题描述:动物园里的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;
}