描述
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入
8 1 3 (n=8 k=1 m=3 )
输出
7 (剩下的那个)
样例输入
8 3 1
样例输出
2
AC Code:
#include<iostream>
#include<cstring>
using namespace std;
struct Node
{
int data;
Node *pre,*next;
};
Node *head,*tail;
int main()
{
int n,m,k;
head = new Node;
head -> next = nullptr;
tail = head;
cin>>n>>k>>m;
if(n==1) {
cout<<1;return 0;
}
Node *s = nullptr;
for(int i = 1;i <=n;++i){
s = new Node;
s ->data = i;
tail->next = s;
s ->pre = tail;
s ->next = nullptr;
tail = s;
}
head = head ->next;
tail -> next = head;
head ->pre = tail;
Node *p = head;
while(--k)
{
p = p -> next;
}
// cout<< p -> data<<endl;
int cnt = n;
int l = 0;
while(p -> next !=p){
l ++;
if(l==m ) {
Node *y = p -> next;
p ->next->pre = p ->pre;
p ->pre->next =p->next;
delete p;
p = y -> pre;
l = 0;
}
//Node * h = p;
p = p ->next;
}
cout<< p -> data<<endl;
}