很简单的题目。简单来说,就是约瑟夫问题的。只是这里的是从两个方向来数不同的数,再删除。
这里的逆时针的是从1到n的方向,顺时针是n到1的方向。
给你n,k,m。一个顺时针数m,一个逆时针数k。
下面的是AC的代码:
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, k;
int a[25];
int go(int p, int flag, int count)
{
int c = 0;
while(true)
{
if(a[p] != 0)
c++;
if(c == count)
break;
p += flag;
if(p == 0 && flag < 0)
p = n;
if(p == n + 1 && flag > 0)
p = 1;
}
return p;
}
int main()
{
// freopen("133.txt", "r", stdin);
while(cin >> n >> k >> m)
{
if(n == 0 && k == 0 && m == 0)
break;
for(int i = 1; i <= n; i++)
a[i] = i;
int count = n, p1 = n, p2 = 1;
while(count != 0)
{
p1 = go(p1, -1, m);
p2 = go(p2, 1, k);
if(p1 != p2)
{
printf("%3d%3d", p2, p1);
a[p1] = a[p2] = 0;
count -= 2;
}
else
{
printf("%3d", p2);
a[p1] = 0;
count--;
}
p1--; p2++;
if(p1 == 0)
p1 = n;
if(p2 > n)
p2 = 1;
if(count)
cout << ',';
}
cout << endl;
}
return 0;
}