您的位置:首页 > 其它

UVa 133 算法竞赛入门经典4-3例题(约瑟夫环类型)

2017-01-20 12:31 435 查看
题目类型:约瑟夫环模型, 函数的简单应用, 自顶向下编程

题目大意 : 输入n, k, m; n个人站成圆环,k,m, 分别代表停顿中间间隔的人数, 其中一个顺时针旋转,一个逆时针旋转, 直 至环中没有人。

注意 : 1次旋转的时候,只有顺逆都完成,所选出的两个人才都被cut到, 不能一个一个的cut,这样会少一个。

难点:怎么弄出来一个圈???

(pos+flag+n-1)%n+1 公式的妙用, 这样控制循环的下一个,不会跑出来。

例题代码:

#include<stdio.h>
#define maxn 25
int n, k, m, a[maxn];

int go(int p, int d, int t)
{
while(t--)
{
do{
p = (p+d+n-1) % n + 1;
}while(a[p] == 0);
}
return p;
}

int main()
{
while(scanf("%d %d %d", &n, &k, &m))
{
if(n == 0 && m == 0 && k == 0) break;
int i;
for(i = 1; i <= n; i++) a[i] = i;
int left = n;
int p1 = n, p2 = 1;
while(left)
{
p1 = go(p1, 1, k);
p2 = go(p2, -1, m);
printf("%3d", p1);
left--;
if(p2 != p1)
{
printf("%3d", p2);
left--;
}
a[p1] = a[p2] = 0;
if(left) printf(",");
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  例题整理
相关文章推荐