約瑟夫問題c++

問題描述:一堆猴子都有編號,編號是1,2,3 ...m,這羣猴子(n個)按照1-m的順序圍坐一圈,從第1開始數,每數到第m個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後一隻猴子,則該猴子爲大王。

解決1:使用數組存放

#define  Maxsize 1000
void jose(int n,int m)
{
	int mon[Maxsize];
	int i,d,count;
	for (i=0;i<n;i++)
		mon[i]=i+1;
	cout<<"Befoue out:"<<endl;
	for (i=0;i<n;i++)
		cout<<mon[i]<<",";
	cout<<endl;
	cout<<"After out:"<<endl;
	count=0;
	i=-1;
	//函數的實現
	while(count<n)
	{
		d=0;
		while(d<m)
		{
			i=(i+1)%n;
			if (mon[i]!=0)
				d++;
		}
		cout<<mon[i]<<",";
		mon[i]=0;
		count++;
	}
	cout<<endl;
}



解法二,使用循環鏈表

typedef struct LNode
{
	int data;
	struct LNode *link;
}LNode,*LinkList;
void jose(int n,int m)
{
	LinkList p,pcur;
	p=(LinkList)malloc(sizeof(LNode));
	//第一隻猴子單獨拉出來了
	p->data=1;
	//循環單鏈表
	p->link=p;
	pcur=p;
	for (int i=1;i<n;i++)
	{
		LinkList tmp=(LinkList)malloc(sizeof(LNode));
		tmp->data=i+1;
		tmp->link=pcur->link;
		pcur->link=tmp;
		pcur=tmp;
	}
	while(n--)
	{
		LinkList tmp;
		for (int s=m-1;s--;tmp=p,p=p->link);
		tmp->link=p->link;
		cout<<p->data<<"->";
		free(p);
		p=tmp->link;
	}
	cout<<endl;
}



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