今天刷到一个挺有意思的题目,叫约瑟夫生死游戏,说是30个人坐船,船超载,需要扔下去15个人才能保证安全,然后这30个人就围成一圈,从第一个人开始报数,数到9的那个老哥就得被扔下去,然后下一个接着从1开始报数,循环往复直到扔下去15个人为止。这游戏听着就刺激,咱必须得用代码实现一下!
搞起!
捋一下思路,这明显是个循环,而且还得有个标记来记录谁出局。咱可以用链表来做,把这30个人看成30个节点,挨个串起来。
我先定义一个结构体,表示链表里的每个节点:
typedef struct node {
小编温馨提醒:本站只提供游戏介绍,下载游戏推荐89游戏,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
int data; // 记录这是第几个人
struct node next; // 指向下一个人的指针
} linklist;
有这个结构体,咱就可以开始创建链表。我写个循环,把30个节点都创建出来,然后把它们连成一个环:
linklist head, p, q;
head = (linklist )malloc(sizeof(linklist)); // 创建头节点
head->data = 1;
p = head;
// 循环创建剩下的29个节点
for (i = 2; i <= 30; i++) {
q = (linklist )malloc(sizeof(linklist));
q->data = i;
p->next = q;
p = q;
p->next = head; // 一个节点指向头节点,形成环
链表有,接下来就是模拟报数和扔人的过程。我再写个循环,从头节点开始,数到9就把那个人扔,也就是把那个节点从链表里删掉:
p = head;
int count = 0; // 记录扔下去的人数
int num = 1; // 报数
while (count < 15) {
if (num == 9) {
// 找到要扔的人
printf("第%d个人被扔下去\n", p->data);
// 把这个人从链表里删掉
q->next = p->next;
free(p);
p = q->next;
num = 1; // 重新开始报数
count++; // 扔下去的人数加一
} else {
// 报数还没到9,继续往下数
q = p;
p = p->next;
num++;
我把剩下的15个人的编号打印出来:
跑起来一看,结果还真出来!
感觉用代码模拟这种场景还挺有意思的,下次遇到什么好玩的题目再分享给大家!