用循環鏈表求解約瑟夫環問題

【約瑟夫環問題】

已知 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

*/


【參考網址】
https://www.cnblogs.com/AlexMiller/p/5532422.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章