解题思路:约瑟夫环。具体见代码:
1 #include2 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("\n");37 }38 return 0;39 }