题目链接:点击此处查看题目
题意:一个由从1到n这些数字按逆时针顺序围成的环(类似于循环队列),一个人从1开始点,每次逆时针数到第k个,然后将第k个数除去;另一个人从n开始,每次顺时针数到第m个,然后将第m个数除去;循环往复,每次依次输出除去的两个数。
思路:用一个数组模拟一下就行了,用p和q两个指针来记录下一次计数的起点,p是逆时针数,q是顺时针数,关键是用p=(p+1)%n和q=(q-1+n)%n两个公式来计算下一个数的位置,然后注意,应该在两人数完并将要清除的数清除后再找下一次计数的起点(因为清除的数就不能再算了!)
完整代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[100],n,k,m;
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
while(cin>>n>>k>>m&&n+k+m)
{
for(int i=0;i<n;i++)
a[i]=i+1;
int N=n,p=0,q=n-1;
while(N>0)
{
for(int i=1;i<k;i++)
{
p=(p+1)%n;
if(!a[p]) i--;
}
for(int i=1;i<m;i++)
{
q=(q-1+n)%n;
if(!a[q]) i--;
}
if(a[p]){
printf("%3lld",a[p]);
a[p]=0;N--;
}
if(a[q]){
printf("%3lld",a[q]);
a[q]=0;N--;
}
for(int i=0;i<n;i++)
{
p=(p+1)%n;
if(a[p]) break;
}
for(int i=0;i<n;i++)
{
q=(q-1+n)%n;
if(a[q]) break;
}
if(N){
printf(",");
}
else{
printf("\n");
}
}
}
return 0;
}