The Dole Queue UVA - 133
问题
代码
// 算法竞赛入门经典习题与解答 P
// 算法竞赛入门经典第2版 P
/*
Dreams never shine!
It's you that shine while chasing your dreams :)
JAYO!!
*/
// #include <iostream>
// using namespace std;
#include <stdio.h>
#define maxn 25
int n, k, m, a[maxn];
// 逆时针走t步,步长是d(-1表示顺时针走),返回新位置
int go(int p, int d, int t) {
while(t--) {
do { p = (p + d + n - 1) % n + 1; } while(a[p] == 0); // 走到下一个非0数字, 加n - 1避免出现负数
} // p = (p + d + n - 1) % n + 1; 正向逆向统一为一个式子
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; // p1逆时针,以1左边的n为起点(初始化自己的起点0值,作为参照点,方便计算k和m)
// 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(",");
}
printf("\n");
}
return 0;
}
知识点
do while() {}
do
{
statement(s);
}while( condition );
请注意,条件表达式出现在循环的尾部,所以循环中的
statement(s) 会在条件被测试之前至少执行一次。
如果条件为真,控制流会跳转回上面的 do,
然后重新执行循环中的 statement(s)。
这个过程会不断重复,直到给定条件变为假为止。
积极思考
积极思考总结归纳!!!Bug好多好多只!!!