#14-【链表】拉手游戏

Description
N个小朋友手拉手站成一个圆圈,从第一个小朋友开始循环报数,报到M的那个小朋友退到圈外,然后他的下一位重新报“1”。这样继续下去,直到最后只剩下一个小朋友,他原来站在什么位置上呢?
Input
仅一行,有两个数N和M,其中N表示小朋友的人数,M表示报到数。1<N<1000,M<=N
Output
仅一个数,留下的小朋友的编号。
Sample Input
8 3
Sample Output
7
// This is AC Code
#include <iostream>

#define SIZE 1001 

using namespace std;

struct node // 定义一个节点
{
	int value;
	node* next;
} a[SIZE], *p;

int total = 0;

int main()
{
	int n, m, i, j;
	
	cin >> n >> m;
	
	if (m == 1)
	{
		cout << n << endl;
		return 0;
	}
	
	for (i = 1; i < n; i++)
	{
		a[i].value = i;
		a[i].next = &a[i+1];
	}
	a[n].value = n;
	a[n].next = &a[1];
	
	i = 1;
	j = 1;
	while (true)
	{
		p = &a[i];
		i = (p->next)->value;
		j++;
		
		if (j == m)
		{
			p->next = a[i].next;
			i = a[i].next->value;
			total++;
			/***********
			   上面是删
			  除节点阶段
			***********/
			j = 1;
			
			if (total == n)
			{
				cout << a[i].value << endl;
				return 0;
			}
		}
	}
	
	return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值