简单题
题意: 类似约瑟夫环问题, 所有人站成一个圈标上号, 两个人分别沿顺时针和逆时针数k个和m个人,
被数到的人则输出序号并出列, 直到所有人被数过为止
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <queue>
#include <map>
using namespace std;
const int MAXN = 20+2;
typedef long long LL;
int Q[MAXN];
int N,k,m;
int right_next(int current, int K){
while( K ){
current++;
while( current>N ){
current-=N;
}
if( !Q[current] ) continue;
K--;
}
return current;
}
int left_next(int current, int K){
while( K ){
current--;
while( current<1 ){
current+=N;
}
if( !Q[current] ) continue;
K--;
}
return current;
}
int main(){
scanf("%d %d %d",&N,&k,&m);
while( !( N==0 && k==0 && m==0 ) ){
for(int i=0; i<=N; i++){
Q[i] = 1;
}
int off1 = 0;
int off2 = N+1;
int cnt = 0;
while( 1 ){
off1 = right_next(off1,k);
off2 = left_next(off2,m);
if( off1==off2 ){
printf("%3d",off1);
Q[off1] = 0;
cnt++;
}else{
Q[off1] = Q[off2] = 0;
printf("%3d%3d",off1,off2);
cnt+=2;
}
if( cnt<N ){
printf(",");
}else{
printf("\n");
break;
}
}
scanf("%d %d %d",&N,&k,&m);
}
return 0;
}