小游戏
题目
现在有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;
}