UVa 133 The Dole Queue

解题思路:约瑟夫环。具体见代码:

 1 #include<cstdio>
 2 using namespace std;
 3 int n, k, m, vis[24];   //24,向科比致敬,像科比一样努力的活着。
 4 
 5 int go(int p, int d, int t)
 6 {
 7     while(t--)
 8     {
 9         do{
10             p = (p+d+n-1)%n + 1; //在纸上写写就知道
11         }while(vis[p]==0); //如果是0,则继续走,并且不计入步数。
12     }
13     return p; //返回走到的位置
14 }
15 
16 int main()
17 {
18     while(~scanf("%d%d%d", &n, &k, &m) && n)
19     {
20         for(int i = 1; i <= n; i++) vis[i] = i;//初始化
21         int left = n, p1 = n, p2 = 1; //这里的初始化要注意
22         while(left)
23         {
24             p1 = go(p1, 1, k); //1表示逆时针
25             p2 = go(p2, -1, m); //-1表示顺时针
26             printf("%3d", vis[p1]);
27             left --;
28             if(p2 != p1)   //如果不同才输出
29             {
30                 printf("%3d", vis[p2]);
31                 left --;
32             }
33             vis[p1] = vis[p2] = 0; //标记为0,表示已走过
34             if(left) printf(","); //最后一个没有标点
35         }
36         printf("
");
37     }
38     return 0;
39 }
View Code
原文地址:https://www.cnblogs.com/loveprincess/p/4835328.html