题目:
n 个人围城一个环,逆时针编号 1~n,A从 1 开始逆时针数 K 个,B从 n 顺时针数 M 个,被选中的 1 或 2 个人一次领救济金,输出顺序。。
思路:用数组模拟,为了避免人走之后数组元素移动,用0表示离开队伍的人。也可以用循环链表实现。。。。。
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<iomanip>
#define ll long long
using namespace std;
int a[100],n;
int go(int p, int d, int t) {
while(t--) {
do {
p = (p + d + n-1)%n + 1;
} while(a[p] == 0); //走到下一个非零数字;
}
return p;
}
int main(){
int k,m;
while(1){
scanf("%d%d%d",&n,&k,&m);
if(n == 0&&k == 0&&m == 0) break;
for(int i = 1; i <= n; i++) a[i] = i;
int left = n;//剩下的人数;
int p1 = n, p2 = 1;
while(left) {
p1 = go(p1, 1, k);
p2 = go(p2, -1, m);
printf("%3d",p1); left--;
if(p2 != p1) {printf("%3d",p2); left--;}
a[p1] = a[p2] = 0;
if(left) printf(",");
}
cout << endl;
}
return 0;
}