ZOJ-1088

约瑟环,纯模拟硬搞的,据说有方法可以直接算,表示不会。。提交了两次,中间把步数优化了一下,原先是直接用m去数,其实可以用m%total步数去数,但这里容易出错,当m%total=0时,要处理一下,用total去数

#include<stdio.h>
#include<stdlib.h>

struct Building;
typedef struct Building *Node;

struct Building
{
	int number;
	Node next;
};

int main()
{
	int n;
	while (scanf("%d", &n), n)
	{
		int i,m;
		Node *array = malloc(n * sizeof(Node));
		for (i = 0; i < n; i++)
			array[i] = malloc(sizeof(struct Building));

		for (m = 1;; m++)
		{
			for (i = 0; i < n - 1; i++)
			{
				array[i]->number = i + 1;
				array[i]->next = array[i + 1];
			}
			array[n - 1]->number = n;
			array[n - 1]->next = array[0];

			Node curr = array[0];
			Node prev = array[n - 1];
			int total = n;
			while (total != 1)
			{
				prev->next = curr->next;
				curr = curr->next;
				total--;
				int step = m % total ? m % total : total;
				for (i = 0; i < step - 1; i++)
				{
					prev = curr;
					curr = curr->next;
				}
			}
			if (curr->number == 2)
				break;
		}
		printf("%d\n", m);

		for (i = 0; i < n; i++)
			free(array[i]);
		free(array);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值