【约瑟夫环问题】
已知 n 个人(n>=1)围坐一圆桌周围,从 1 开始顺序编号,从序号为 1 的人开始报数,顺时针数到 m 的那个人出列。下一个人又从 1 开始报数,数到m 的那个人又出列。依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的初始编号。
【输入输出】
输入人数 n,所报数 m,输出最后一个人的初始编号。
【解决思路】
模型构建:因为是圆桌问题,使用链表解决的话需要构建循环链表。
出列问题:设计思路是将指向链表的指针移动到需要出列的人的位置,然后根据正常的链表删除进行操作即可。
【程序代码】
#include <iostream>
using namespace std;
struct node {
int data;
node *next;
};
int n,m;
node *head,*p,*r;
int main() {
int i,j;
cin>>n>>m;
head=new node;
head->data=1;
head->next=NULL;
r=head;
for (i=2; i<=n; i++) {
p=new node;
p->data=i;
p->next=NULL;
r->next=p;
r=p;
}
r->next=head;
r=head;
for(i=1; i<=n; i++) {
for (j=1; j<=m-2; j++) r=r->next;
cout<<r->next->data<<" ";
r->next=r->next->next;
r=r->next;
}
return 0;
}
/*
in:
10 3
out:
3 6 9 2 7 1 8 5 10 4
*/