数据结构趣味题-约瑟夫环

it2026-01-11  10

1.约瑟夫问题

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个 洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数 到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus 要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

2. 约瑟夫问题的简化演示

3.示例代码

其中CircleLinkList.h和CircleLinkList.c的文件在循环队列中可以找到,这里仅给出main.c的代码.

/* 文件名:main.c 作者:Muten 编码时间:20201022 编码目的:演示测试约瑟夫问题中最后两个元素 代码功能:测试约瑟夫问题中最后两个元素 测试环境:Mircosoft Visual Studio Professional 2015 版本14.0.25431.01 Update3 版本信息:VER1.0 */ #include "CircleLinkList.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 41 #define N 3 typedef struct MYNUM { CircleLinkNode node; int val; }MyNum; int MyCompare(CircleLinkNode* data1, CircleLinkNode* data2) { MyNum* num1 = (MyNum*)data1; MyNum* num2 = (MyNum*)data2; if (num1->val == num2->val) { return NODESAME_TRUE; } return NODESAME_FALSE; } void MyPrint(CircleLinkNode* data) { MyNum* num = (MyNum*)data; printf("%d ",num->val); } int main() { // 创建循环链表 CircleLinkList* clist = Init_CircleLinkList(); // 链表插入数据 MyNum num[M]; for (int i = 0; i < M; i++) { num[i].val = i + 1; //printf("num[i].val = %d.\n", num[i].val); Insert_CircleLinkList(clist,i,(CircleLinkNode*)&num[i]); } // 打印 Print_CircleLinkList(clist,MyPrint); printf("\n"); int index = 1; CircleLinkNode* pCurrent = clist->head.next; while (Size_CircleLinkList(clist)>1) { if (index == N) { MyNum* temNum = (MyNum*)pCurrent; // 缓存待删除节点的下一个 CircleLinkNode* pNext = pCurrent->next; // 根据值去删除 RemoveByValue_CircleLinkList(clist,pCurrent, MyCompare); printf("%2d 号人GG了 \n", temNum->val); pCurrent = pNext; if (pCurrent == &(clist->head)) pCurrent = pCurrent->next; index = 1; } pCurrent = pCurrent->next; if (pCurrent == &(clist->head)) pCurrent = pCurrent->next; index++; } if (Size_CircleLinkList(clist) == 1) { MyNum* tempNum = (MyNum*)Front_CircleLinkList(clist); printf("%d \n", tempNum->val); } else { printf("出错 \n"); } // 释放链表内存 FreeSpace_CircleLinkList(clist); return 0; }

结果演示,16号是约瑟夫的朋友,31号是约瑟夫(哈哈,最后一个死):

 

 

最新回复(0)