循环队列,本来要用链表模拟,可是因为是同时删除两个节点,而在模拟时后删除的节点可能会影响先删除的节点(删除第一个节点后指针指向下一个节点,而该节点如果是要删除的第二个节点的话指针还要移动),感觉有点麻烦,就用数据模拟了,反正数据也不大。
代码如下:

1 #include <cstdio> 2 using namespace std; 3 4 const int maxn = 25; 5 int a[maxn]; 6 int size; 7 8 int main() 9 { 10 #ifdef LOCAL 11 freopen("in", "r", stdin); 12 #endif 13 int n, k, m; 14 while(scanf("%d%d%d", &n, &k, &m) != EOF && !(!n && !k && !m)) 15 { 16 int first = 1; 17 for(int i = 0; i < n; i++) 18 a[i] = i+1; 19 size = n; 20 int p = n-1, q = 0; 21 while(size > 0) 22 { 23 for(int cnt = 0; cnt < k; ) 24 { 25 p = (p+1)%n; 26 if(a[p]) cnt++; 27 } 28 for(int cnt = 0; cnt < m; ) 29 { 30 q = (q-1+n)%n; 31 if(a[q]) cnt++; 32 } 33 if(first) first = 0; 34 else printf(","); 35 if(p == q) 36 { 37 printf("%3d", a[p]); 38 a[p] = 0; 39 size--; 40 } 41 else 42 { 43 printf("%3d%3d", a[p], a[q]); 44 a[p] = a[q] = 0; 45 size -= 2; 46 } 47 } 48 printf("\n"); 49 } 50 return 0; 51 }
开始把int first = 1; 写到最外面了,结果后面的输出每行都是以一个逗号开头,让我WA的不明不白,后来突然发现了这个问题。一直用它给的样例测试,看来以后如果只给一个样例输入的话,还是要多测试一下的,不能太懒了,多复制粘贴几下也好啊,最起码也有了好几组数据呢。