排队出列算法

来源:互联网 发布:php htnl模板引擎 编辑:程序博客网 时间:2024/04/28 12:05

要求:n个人围成一圈,一次编号为1...n,第一次从1报数,直到m(m>0)的那个人出列,他的下一位又从1开始,数到m的那个人再出列,就一直这样循环,直到所有人都出列,如果告诉你m和n,请编写一个程序,返回最后一个人的位置:

我的算法是:将这n个人放到一个容器中,初始值为1,当第i个人数到规定的数时,其值归零,再从下一位开始,当遇到值为0的位置时,说明这个位置已经没人了,跳过即可,且每当一个位置归零,都要判断这个数组中是否还有值为1的存在,若没有,则说明这个数组已经全部为空,当前这个归零的位置即为最后出列的位置:代码如下:

#include<iostream>
#include<vector>
using namespace std;
int flag(vector<int> que,int n)//判断是否还有人
{
int i;
for(i=0;i<n;i++)
{
if(que[i]==1)//说明这个位置有人,不用往下在查了,这个圈还有人。当然也可以用迭代器来遍历!
return 1;
}
return 0;//说明没有人了
}
int Laster(int n,int m)
{
int i,k=0;
vector<int> queue(n,1);
for(i=0;;i++)
{
if(i>=n)
{
i=0;
}
if(queue[i]==0)
continue;//这个位置没人,跳过!
else
{
k++;//报数
if(k==m)
{
queue[i]=0;//归零,代表这个人出队
k=0;//报数从新开始,下个人开始加一
if(!flag(queue,n))//判断还有没有人
{
return i+1;
}
}
}
}
}
int main()
{
int n,m;
cout<<"请输入长度n和规定的数m"<<endl;
cin>>n>>m;
cout<<Laster(n,m)<<endl;
system("pause");
return 0;
}

使用C++的原因是为了使用vector,若是使用C,则在数组的使用过程中,可能会浪费大量的空间或是空间不足,用C++就避免了这个问题。

0 0
原创粉丝点击