双向约瑟夫环吗,很简单直接模拟就行了
#include <stdio.h>
int n , k , m , a[25];
int solve1(int p) {
int t = m;
while(t--) {
p = ((p + n - 2) % n) + 1;
while(a[p] == 0)
p = ((p + n - 2) % n) + 1;
}
return p;
}
int solve2(int p) {
int t = k;
while(t--) {
p = ((p + n) % n) + 1;
while(a[p] == 0)
p = ((p + n) % n) + 1;
}
return p;
}
int main() {
while(~scanf("%d %d %d",&n,&k,&m) && n) {
for(int i = 1; i <= n; i++) a[i] = i;
int s = n;
int B = n , A = 1;//A ni , B shun
while(s) {
A = solve1(A);//p2
B = solve2(B);//p1
printf("%3d",B);s--;
if(A != B) {
printf("%3d",A);
s--;
}
a[A] = a[B] = 0;
if(s) printf(",");
}
printf("\n");
}
return 0;
}
本文介绍了一种解决双向约瑟夫环问题的C语言实现方法。通过两个函数solve1和solve2分别模拟顺时针和逆时针的淘汰过程,最终输出剩余人员编号。
2584

被折叠的 条评论
为什么被折叠?



