首页 游戏推荐 正文

约瑟夫生死游戏太烧脑!有没有更容易的版本?

今天刷到一个挺有意思的题目,叫约瑟夫生死游戏,说是30个人坐船,船超载,需要扔下去15个人才能保证安全,然后这30个人就围成一圈,从第一个人开始报数,数到9的那个老哥就得被扔下去,然后下一个接着从1开始报数,循环往复直到扔下去15个人为止。这游戏听着就刺激,咱必须得用代码实现一下! 搞起! 捋一下思路,这明显是个循环,而且还得有个...

今天刷到一个挺有意思的题目,叫约瑟夫生死游戏,说是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个人的编号打印出来:

跑起来一看,结果还真出来!

感觉用代码模拟这种场景还挺有意思的,下次遇到什么好玩的题目再分享给大家!