【約瑟夫環問題】
已知 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;
}
}
/*
in:
10 3
out:
3 6 9 2 7 1 8 5 10 4
*/