有M个敢死队员要炸掉敌人的一碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。
排长是不愿意去的,假设排长为1号,请你设计一程序,求出从第几号战士开始计数才能让排长最后一个留下来而不去执行任务。
//*************************************************循环队列实现
#define QueueSize 100
typedef struct
{
int data[QueueSize];
int front;
int rear;
int count;
}CirQueue;
void Initial(CirQueue *Q)
{
Q-front=Q-rear=0;
Q-count=0;
}
int Empty(CirQueue *Q)
{
return Q-front==Q-rear;
}
int Full(CirQueue *Q)
{
return Q-rear==QueueSize-1 Q-front;
}
void EnQueue(CirQueue *Q,int x)
{
if(Full(Q))
{
cout\"队列上溢.\";
exit(1);
}
Q-count;
Q-data[Q-rear]=x;
Q-rear=(Q-rear 1)%QueueSize;
}
int DeQueue(CirQueue *Q)
{
int temp;
if(Empty(Q))
{
cout\"队列为空.\";
exit(1);
}
temp=Q-data[Q-front];
Q-count--;
Q-front=(Q-front 1)%QueueSize;
return temp;
}
void xunhuanduilie()
{
int start,count,i,j,n,m;
CirQueue s;
input(n,m);
for(start=1;start=n;start)
{
Initial(
for(i=1;i=n;i)
EnQueue(
for(i=1;istart;i)
{
j=DeQueue(
EnQueue(
}
count=1;
while(countn)
{
for(i=1;im;i)
{
j=DeQueue(
EnQueue(
}
j=DeQueue(
count;
}
if(s.data[s.front]==1)
break;
}
coutendl\"从\"start\"开始报数,排长是最后一个出列的。\"endl;
}
//end************************************************************循环队列
|