約瑟夫環 (Ver. I - A)
阿新 • • 發佈:2018-11-09
題目描述
N個人坐成一個圓環(編號為1 - N),從第S個人開始報數,數到K的人出列,後面的人重新從1開始報數。問最後剩下的人的編號。
例如:N = 3,K = 2,S = 1。2號先出列,然後是1號,最後剩下的是3號。
要求使用迴圈連結串列實現。
輸入
測試資料有多組,
每組包括3個數N、K、S,表示有N個人,從第S個人開始,數到K出列。(1 <= N <= 10^6,1 <= K <= 10, 1 <= S <= N)
輸出
出列的人的編號
樣例輸入
13 3 1 3 2 1
樣例輸出
3 6 9 12 2 7 11 4 10 5 1 8 13 2 1 3
#include <iostream> #include <algorithm> #define ok 0 #define error -1 using namespace std; struct Node { int data; Node *next; Node(int _data=0, Node *_next=NULL):data(_data),next(_next){} }; Node *createlist(int n,int *data) { Node *head = new Node; Node *s,*tail=head; for(int i=0; i<n; i++) { s = new Node(data[i],NULL); tail->next = s; tail = s; } tail->next=head; return head; } void test(int u) { Node *head,*temp; int k,*data,n=u,s; cin>>k>>s; data = new int[n]; for(int i=0;i<n;i++) { data[i]=i+1; } head = createlist(n,data); Node *p=head,*q=head,*z=head; int w=s,num=1,x=0; while(w--) { p=p->next; } while(1) { if(q->next==p) break; else q=q->next; } while(1) { if(p==head) { p=p->next; q=q->next; continue; } if(num==k) { cout<<p->data<<" "; q->next=p->next; z=p; p=p->next; free(z); x++; if(x==n) break; num=(num%k)+1; } else { p=p->next; q=q->next; num=(num%k)+1; } } cout<<endl; } int main() { int n; while(cin>>n) { test(n); } return 0; }