敢死队问题用循环队列 帮我分析下程序 C/C 主要是xunhuanduilie()函数里的while{***}这段

[复制链接]
查看11 | 回复1 | 2011-3-21 07:37:29 | 显示全部楼层 |阅读模式
有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************************************************************循环队列
回复

使用道具 举报

千问 | 2011-3-21 07:37:29 | 显示全部楼层
<pre id=\"best-answer-content\" class=\"reply-text mb10\">实质上是约瑟夫环问题,百度搜索就有的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行