C 语言实例 - 约瑟夫生者死者小游戏
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
实例
#include<stdio.h>
int c = 0;
int i = 1;
int j = 0;
int a[30] = { 0 };
int b[30] = { 0 };
int main() {
while (i<=31) {
if (i == 31) {
i = 1;
} else if (c == 15) {
break;
} else {
if (b[i] != 0) {
i++;
continue;
} else {
j++;
if (j != 9) {
i++;
continue;
} else {
b[i] = 1;
a[i] = j;
j = 0;
printf("第%d号下船了\n", i);
i++;
c++;
}
}
}
}
}
执行以上实例,输出结果为:
第9号下船了 第18号下船了 第27号下船了 第6号下船了 第16号下船了 第26号下船了 第7号下船了 第19号下船了 第30号下船了 第12号下船了 第24号下船了 第8号下船了 第22号下船了 第5号下船了 第23号下船了
袁博
cdy***[email protected]
我认为用一个数组完成这个算法更好理解。
袁博
cdy***[email protected]
lsz
257***[email protected]
lsz
257***[email protected]
zhaojingjing
jzh***[email protected]
用一种比较复杂的方式解决。
前面的用的方法都比较简单,可惜我没想到,我一上来就想的是用循环链表。
zhaojingjing
jzh***[email protected]
starrysky
847***[email protected]
先确定哪个位置的人会报出 9,找到之后下一次跳过此人,直至人数等于 15。
starrysky
847***[email protected]
夜雨无愁
295***[email protected]
参考方法:
夜雨无愁
295***[email protected]
big_tree
286***[email protected]
上面都是大佬,在没看笔记之前,自己也按照自己的思路写了一下。
思路:就像把30张扑克牌叠在一起,抽到了,就丢掉。难点在于如何将收尾衔接好
big_tree
286***[email protected]
Justin
576***[email protected]
参考:
Justin
576***[email protected]
13579
946***[email protected]
看了一遍都是用标记的,为什么没有这种解法呢?
13579
946***[email protected]
大宅院里的三表哥
gul***[email protected]
使用数组:
使用链表:
使用公式法递推:
大宅院里的三表哥
gul***[email protected]