約瑟夫問題程序實現

問題:已知n個人(以編號1,2,3,...,n表示)圍坐在一張圓桌周圍。從編號爲k的人開始報數,數到m的那個人出列;他的下一個人又從開始報數,數到m的那個人又出列;以此規律重複下去,知道圓桌周圍的人全部出列。

編碼實現:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

typedef struct LNode
{
	int data;
	struct LNode *link;
}LNode, *LinkList;

void JOSEPHUS(int n, int k, int m)//n爲總人數,k爲第一個開始報數的人,m爲出列者喊到的數
{
	//r爲當前節點,p爲輔助節點,指向r的後繼節點
	LinkList p, r, curr;

	//create CircleLinkTable
	p = (LinkList)malloc(sizeof(LNode));
	p->data =1;
	p->link = p;
	curr = p;
	for(int i = 2; i<=n; i++)
	{
		LinkList t=(LinkList)malloc(sizeof(LNode));
		t ->data =i;
		t ->link = curr->link;
		curr ->link =t;
		curr =t;
	}
//把當前指針移動到第一個報數的人
	while(k--)
	{
		r = p;
		p = p->link;
	}
	//開始數數
	while(n--)
	{
		int s = m-1;
		while(s)
		{
			s =s-1;
			r = p;
			p=p ->link;
		}
		r->link=p->link;
		cout <<p->data<<endl;
		free(p);
		p = r ->link;
	}
}
int main(int argc, char* argv[])
{
	JOSEPHUS(13, 4, 2);
	return 0;
}


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