标签:
解题思路:约瑟夫环。具体见代码:
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("\n"); 37 } 38 return 0; 39 }
标签:
原文地址:http://www.cnblogs.com/loveprincess/p/4835328.html