uva 133

来源:互联网 发布:win10用的c语言编译器 编辑:程序博客网 时间:2024/04/29 12:02

简单题

题意: 类似约瑟夫环问题, 所有人站成一个圈标上号, 两个人分别沿顺时针和逆时针数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;}


0 0