水题,用循环数组加标记统计就可以了,注意循环数组从0开始好一些,比较容易计算。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#define LL __int64
using namespace std;
//vector<int> v;
int main()
{
int n,k,m;
while(cin>>n)
{
cin>>k>>m;
if(n==0&&k==0&&m==0) break;
int a[25];
for(int i=0;i<n;i++)
a[i]=i+1;
int tt=0;
int nx=n-1,ny=0;
while(tt!=n)
{
// int len=n-tt;
int len1=0,len2=0;
while(len1!=k)
{
nx=(nx+1)%n;
if(a[nx])
len1++;
}
while(len2!=m)
{
ny=(ny-1+n)%n;
if(a[ny])
len2++;
}
if(nx==ny)
{
tt++;
printf("%3d",a[nx]);
a[nx]=0;
}
else
{
tt+=2;
printf("%3d%3d",a[nx],a[ny]);
a[nx]=0;
a[ny]=0;
}
if(tt!=n)
cout<<',';
}
cout<<endl;
// cout<<"hehe"<<endl;
/* v.clear();
for(int i=0;i<n;i++)
v.push_back(i+1);
int nx=(k-1)%n,ny=(n-m)%n;
cout<<nx<<' '<<ny<<endl;
while(!v.empty())
{
if(nx==ny)
{
printf("%3d,",v[nx]);
v.erase(v.begin()+nx);
nx=(nx+k-1)%v.size();
ny=(ny-m-1)%v.size();
}
else
{
printf("%3d%3d,",v[nx],v[ny]);
v.erase(v.begin()+nx);
v.erase(v.begin()+ny);
if(nx>ny)
{
nx=(nx+k-2)%v.size();
ny=(ny-m-1)%v.size();
}
else
{
nx=(nx)
}
}
}*/
}
return 0;
}