约瑟夫环问题单循环链表解法讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

约瑟夫环问题单循环链表解法

Description

约瑟夫环问题;有N个人围成一个环,从第一个人开始报数,报到M的人退出环,并且由他的M值来代替原有的M值,要求输出离开环的顺序。

Input

第一行有2个数,M和N。(0

第二行有 N 个数,表示每个人的 M 值。

Output

按照样例的格式,输出所有人退出环的顺序。

Sample Input

4 6

5 4 2 3 4 2

Sample Output

4,1,2,3,6,5

Source

#include"iostream"

#include"cstdio"

#include"cstdlib"

using namespace std;

typedef struct cnode{

int label;

int data;

struct cnode *next;

}cnode;

int m,n,i,value,j;

cnode *p,*q;

int main(

{

cin>>m>>n;

cnode *clist;

q=(cnode *malloc(sizeof(cnode;

clist=q;

for(i=1;i<=n;i++

{

//cin>>value;

cin>>value;

p=(cnode *malloc(sizeof(cnode;

//p=new cnode;

p->label=i;

p->data=value;

p->next=NULL;

q->next=p;

q=p;

if(i==nq->next=clist->next;

}

p=clist;

//cout< label<

for(i=1;i<=n;i++

{

for(j=1;j

{

p=p->next;

}

q=p->next;

m=q->data;

if(i==n{cout< label< cout< label<<","; p->next=q->next;

delete q;

}

//system("pause";

return 1;

}

数组解法:

#include using namespace std;

int main(

{

int *a,*b;

int i,j,t,k,l,m,n;

cin>>m>>n;

a=new int[n];

b=new int[n];

for (i=0;i

{

cin>>a[i];

b[i]=i+1;

}

b[n-1]=0;

k=0;

l=n-1;

m=m%n;

if (m==0 m=n;

for (i=0;i

{

for (j=1;j

{

l=k;

k=b[k];

}

cout <

t=n-i-1;

m=a[k]%t;

if (m==0 m=n-i-1;

b[l]=b[k];

k=b[k];

}

cout << k+1<

free(a;

free(b;

system("pause";

return 0;

}

相关文档
最新文档