码迷,mamicode.com
首页 > 其他好文 > 详细

约瑟夫问题求解

时间:2014-07-23 13:11:14      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:约瑟夫   循环链表   

问题描述:有N个人,从1到N的编号,围成一个环,第一个人从1开始报数,每隔第M的人就出局,剩下的人继续报数,以此类推,求最后剩下那个人的编号。

上次去参加去哪儿网的笔试,就考到了这个问题,说的是12个人,一个圈,从第一个人开始报数,1-3,每次报到3的人出局,求最后剩下那个人原来的序号。

可以用一个循环链表来解决,将所有人的编号构成一个循环链表,每隔M就删掉一个节点,直到最后剩下一个。

void josephus (int N, int M)
{
	//定义一个节点,当然定义在这里不怎么合适
	struct node {
		int item;
		struct node *next;
	}Node;

	//创建第一个节点
	Node *t = malloc (sizeof (Node));
	Node *x = t;
	t -> item = 1;
	t -> next = t;

	//创建剩下的节点
	for (int i = 2; i <= N; i++)
	{
		Node *new = malloc (sizeof (Node));
		x -> next = new;
		x = x -> next;
		x -> item = i;
		x -> next = t;
	}
	//循环数数,每隔M的人出局
	while (x != x -> next)  //不是最后一个节点
	{
		for (int i = 1; i < M; i++)
			x = x -> next;
		//第M个人出局
                Node *del = x -> next;
                x -> next = x -> next -> next;
                free(del);
                N--;
	}
	//打印最后一个节点
	printf ("%d", x -> item);
        free(x);
 }


约瑟夫问题求解

标签:约瑟夫   循环链表   

原文地址:http://blog.csdn.net/willib/article/details/38060105

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!