UVA - 133 The Dole Queue

来源:互联网 发布:中联软件 编辑:程序博客网 时间:2024/06/08 04:26

题目大意:N 个人围成环逆时针编号,逆时针从 1 开始数第 m 个出列,顺时针从 N 开始数第 k 个人出列,若数到同一个人,出列一次。下一轮从当前位置开始数,直至所有人出列。输出编号,宽度 3。

解题思路:编号,循环查找,下标到 0 时改为 N,为 N+1 时改为 1,使数组头尾连接。出列后编号改为 0,计数时跳过,注意要两个都找到再判断是否相同,输出。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctype.h>using namespace std;int queue[25];int main() {    int N, k, m;    while (scanf("%d%d%d", &N, &k, &m) != EOF) {        if (N == 0 && k == 0 && m == 0) break;        for (int i = 1; i <= N; i++)            queue[i] = i;        int a = 0, b = N + 1;        while(1) {            for (int i = a + 1, j = 0; ; i++) {                if (i == N+1) i = 1;                if (queue[i] != 0) j++;                if (j == k) { a = queue[i]; break;}            }            for (int i = b - 1, j = 0; ; i--) {                if (i == 0) i = N;                if (queue[i] != 0) j++;                if (j == m) { b = queue[i]; break;}            }            if (a == b) {                printf("%3d", a);                queue[a] = 0;            }            else {                printf("%3d%3d", a, b);                queue[a] = 0;                queue[b] = 0;            }            int tag = 1;            for (int i = 1; i <= N; i++)                if (queue[i] != 0) tag = 0;            if (tag) break;            printf(",");        }        printf("\n");    }return 0;}
0 0
原创粉丝点击