原題大意:
編號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);
}
}