您的位置:首页 > 产品设计 > UI/UE

133 - The Dole Queued

2016-08-18 07:00 330 查看
原题大意:

编号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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: