小游戏
题目大意:
有n个数形成一个环,从第S个开始,先往后数N个数然后把这个数取出来,再往前数K个数把这个数取出来,问取的数字依次是什么
原题:
题目描述
【题目背景】
yk同学是一个灰常灰常有爱的同学,虽然各种老师总是让他干看似很无聊的事情,但是他总是发明一些好玩的办法来完成这些无聊的任务,这样yk就不会整天那么忧郁啦~ 这次,老师又给他布置了一个任务,让他搬凳子~~ 当然他非常有爱地把这个任务发展成了一个小小小游戏~ hoho,现在他让你来玩这个小游戏,have a try~
【题目描述】
现在有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 n,m,k,l,o,nn,p[1005];
int main()
{scanf("%d %d %d %d",&n,&m,&k,&l);for (int i=1;i<=n;++i)p[i]=1;k=(k-1)%n+1;//走了一环的就删掉l=(l-1)%n+1;o=m-1;nn=n;while (nn){for (int i=1;i<=k;++i){o++;//累加if (o>n) o=1;//到达边界while (!p[o])//不在了{o++;if (o>n) o=1;}}p[o]=0;//删掉printf("%d ",o);//输出nn--;//少一个if (!nn) break;//如果for (int i=1;i<=l;++i){o--;//往左走if (!o) o=n;while (!p[o]){o--;if (!o) o=n;}}p[o]=0;//同上printf("%d ",o);nn--;}
}