开一个数组来表示人站成的圈,其中输出的地方(离开的人的位置)被记录成为0,再循环中可以避开
记录下剩下的人,以此作为循环的条件,利用函数表示出走的过程
输出一次,left(剩下的人数)就自减1,先输出配p1,在进行判断p1和p2是否相同,如果不相同就输出p2,left - -
然后在输出的后面顺便让出队的人所对应的值变为0,以此来记录这个人不在队内
函数:函数内同样是利用循环实现的
由于是环形结构,所以每走一圈就会回到初始位置,涉及周期性的问题,走的步数要用周期性的式子表示
p = (p + d + n - 1) % n + 1
顺时针逆时针的情况也不一样,但是可以放在同一个式子里面表示
当遇到0时则进行向后走一位,但是不会计入步数内,所以这里用do while结构会更好
代码:
#include<bits/stdc++.h>
using namespace std;
int n, k, m;
const int N = 110;
int a[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(){
while(scanf("%d%d%d", &n, &k, &m) == 3 && n){
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(p1 != p2) {
printf("%3d", p2); left -- ;
}
a[p1] = a[p2] = 0;
if(left) printf(",");
}
puts("");
}
return 0;
}
注意细节