约瑟夫环问题单循环链表解法讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}