小游戏

小游戏

题目

现在有M个凳子排成一个圈,我们顺时针给凳子依次编号为1,2,3……,M。我们从编号为S的凳子开始,每次先顺时针数N个凳子,将第N个凳子搬走,然后再逆时针数K个凳子,将第K个凳子搬走。每次都这样先顺时针数N个,再逆时针数K个,直到只剩1个凳子,直接搬走。最后,我们想知道M个凳子的搬走顺序。

输入

共4行,每行1个数,分别表示题目中的M,S,N,K。

输出

仅一行,凳子搬走的序列,每个编号间有一个空格。

输入样例

8
1
3
2

输出样例

3 1 5 2 7 4 6 8

数据范围

100% M<=1000

思路

其实这道题就是一道模拟题。

代码

#include<cstdio>
using namespace std;
int m,s,n,k,a[1001];
int main()
{
	scanf("%d%d%d%d",&m,&s,&n,&k);//读入
	s--;if (s==0) s=m;//因为我这里不判断站的位置有没有凳子,而只有第一次有,所以要特判
	for (int i=1;i<=m;i++) a[i]=i;
	int e=m;
	while (e)//如果取完了就退出
	{
		int wo=n;//顺数拿凳子
		while (wo)
		{
			s++;if (s>m) s=1;
			if (!a[s]) wo++;//如果那个地方没有凳子则要再多走一步
			wo--;
		}
		a[s]=0;
		e--;
		if (!e)//判断是否已经取完
		{
			printf("%d",s);
			break;
		}
		else printf("%d ",s);
		wo=k;//逆数拿凳子
		while (wo)
		{
			s--;if (s==0) s=m;
			if (!a[s]) wo++;//如果那个地方没有凳子则要再多走一步
			wo--;
		}
		a[s]=0;
		e--;
		if (!e) printf("%d",s);
		else printf("%d ",s);
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值