朴素版本:
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}LNode;
int main()
{
LNode *First,*P,*tmp;
First=new LNode;
P=First;
int n,m;scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
tmp=new LNode;
tmp->data=i;
P->next=tmp;
P=tmp;
}
P->next=First->next;
P=First->next;
delete First;
int id=0;
while (P->next!=P)
{
if(m==1) m+=(n-id);
for (int i=1;i<m-1;i++) P=P->next;
tmp=P->next;
printf("No.%d is %d\n",++id,tmp->data);
P->next=P->next->next;
delete tmp;
P=P->next;
}
printf("No.%d is %d\n",++id,P->data);
delete P;
return 0;
}
课程实践版本:
每个人有一个num,跳出时将当前的m改为num继续约瑟夫环
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int data,num;
struct node *next;
}LNode;
int main()
{
LNode *First,*P,*tmp;
First=new LNode;
P=First;
int n,m;scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
tmp=new LNode;
tmp->data=i;
int x;scanf("%d",&x);
tmp->num=x;
P->next=tmp;
P=tmp;
}
P->next=First->next;
P=First->next;
delete First;
int id=0;
while (P->next!=P)
{
if(m==1) m+=(n-id);
for (int i=1;i<m-1;i++) P=P->next;
tmp=P->next;
printf("No.%d is %d\n",++id,tmp->data);
P->next=P->next->next;
m=tmp->num;
delete tmp;
P=P->next;
}
printf("No.%d is %d\n",++id,P->data);
delete P;
return 0;
}