一道算法题目,约瑟夫环问题,输入数据大于10速度很慢,如何优化?
有2*k个人,围成一圈,问,最小的m(从1到m报数,数到m的人离开队列),使得编号k+1到2*k的人先出队列。我用单向循环链表来做,不过发现数据大于10的时候速度很慢,我不知道如何优化,
题目原题http://。
我的代码如下:
#include <iostream>
using namespace std;
typedef struct node{
int number;
bool exit;
struct node* next;
}node,*pnode;
int main(){
node head;
head.number=1;
head.exit=true;
head.next=NULL;
node* p=NULL;
p=&head;
node* q=NULL;
int k;
int i;
int m;
int count;
while(cin>>k){
if (k==0)return 0;
for (i=0;i<2*k-1;i++)
{
q=new node;
q->number=i+2;
q->exit=true;
q->next=NULL;
p->next=q;
p=q;
}
p->next=&head;
for (m=1;m<2504884;m++)//0x7fffffff
{
for (i=0;i<2*k;i++)
{
p->exit=true;
p=p->next;
}
p=&head;
i=1;
count=0;
while(1){
if (i <= m)
{
if (p->exit==true)
{
if (i==m)
{
int fsdfsd=p->number;
if (p->number <= k)break;
else
{
count++;
p->exit=false;
if (count==k)
{
goto showm;
}
}
} //if(i==m)
p=p->next;
i++;
}
else
{
p=p->next;
}
}
else
{
i=1;
}
}//while(1)
}//m=0;m<10000;m++
showm:
cout<<m<<endl;
p=&head;
for (i=0;i<2*k;i++)
{
p->number=0;
p->exit=false;
p=p->next;
}
}
return 0;
}