原题大意:
编号1-N的N个人由1开始逆时针站成一个环。
从第一个人开始逆时针数K个人;再从第N个人开始顺时针数M个人,第K、M出队。
如果KM是同一个人,只出队一次。
从K逆时针下一个人、N顺时针下一个人开始,重复上述步骤。
直到队列为空。
思路:
关键字:数据结构
两种实现方式:双向链表
环形数组
此处选用数组。
二个操作:1.从某位置逆时针数K个 counter_clockwise(int i,int k)
2.从某位置顺时针数M个 clockwise(int i,int m)
代码:
#include<iostream>
using namespace std;
int a[20];
int N, K, M;
int length;
//从位置i开始逆时针数k位(当前的数要被数),返回第k位的位置 //如果一直都找不到怎么办?
int counter_clockwise(int i,int k) {
int cnt = k;
int j = i ;
while(true){
if (a[j] != -1)
{
cnt--;
if (cnt == 0)break;
}
if (j == 0)j = N - 1;
else j--;
}
return j;
}
//从位置i开始顺时针数m位(当前的数要被数),返回第M位的位置
int clockwise(int i,int m) {
int cnt = m;
int j = i;
while (cnt>0) {
if (a[j] != -1)
{ cnt--;
if (cnt == 0)break;
}
if (j == N-1)j = 0;
else j++;
}
return j;
}
int main() {
FILE*stream;
freopen_s(&stream, "C:\\Users\\zgwng\\Desktop\\133.txt", "r", stdin);
scanf_s("%d %d %d", &N, &K, &M);
while(N!=0){
getchar();
for (int i = 0; i < N; i++)
a[i] = N - i;
length = N;
int start = N - 1, end = 0;
while (length != 0) {
int p1 = counter_clockwise(start, K);
int p2 = clockwise(end, M);
if (p1 == p2)
{
if(length==1)printf(" %d\n", a[p1]);
else printf(" %d,", a[p1]);
a[p1] = -1;
length--;
}
else
{
if(length==2)printf(" %d %d\n", a[p1], a[p2]);
printf(" %d %d,", a[p1], a[p2]);
a[p1] = -1; a[p2] = -1;
length -= 2;
}
if (length == 0)break;
start = counter_clockwise(p1,1);
end = clockwise(p2,1);
}
scanf_s("%d %d %d", &N, &K, &M);
}
}