约瑟夫问题(Josephus Problem)算法分析及代码
来源:互联网 发布:simsun.ttc linux 编辑:程序博客网 时间:2024/05/20 10:21
约瑟夫问题简介
据说着名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
约瑟夫问题算法分析
约瑟夫问题可用代数分析来求解,将这个问题扩大好了,假设现在您与m个朋友不幸参与了这个游戏,您要如何保护您与您的朋友?只要画两个圆圈就可以让自己与朋友免于死亡游戏,这两个圆圈内圈是排列顺序,而外圈是自杀顺序,如下图所示:
使用程式来求解的话,只要将阵列当作环状来处理就可以了,在阵列中由计数1开始,每找到三个无资料区就填入一个计数,直而计数达41为止,然后将阵列由索引1开始列出,就可以得知每个位置的自杀顺序,这就是约瑟夫排列,41个人而报数3的约琴夫排列如下所示:
14 36 1 38 15 2 24 30 3 16 34 425 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 2923
由上可知,最后一个自杀的是在第31个位置,而倒数第二个自杀的要排在第16个位置,之前的人都死光了,所以他们也就不知道约琴夫与他的朋友并没有遵守游戏规则了。
代码实现(C/OC)
#define N 41 //总人数#define M 3 //数到第几个人就自杀
//主程序,不清楚的参考注释int man[N] = {0};//排列顺序数组,里面有所有的人,下标从0开始int count = 1;//自杀了多少人,<=Nint i = 0;//0<=i<=3,用于临时计数int pos = -1;//数到第几个人了,算是标记int alive = 0;while(count <= N) {//还有人存活,继续 do { pos = (pos+1) % N; //环状处理,>N时,pos进入下一圈儿 if(man[pos] == 0)//如果这个位置的人还活着 i++;//计数+1 if(i == M) {//报数为3了 i = 0;//计数清零 break;//跳出,去执行自杀 } } while(1); man[pos] = count;//第count个自杀的人,在排列上是第pos个位置, count++;//自杀完成,自杀人数+1}printf("\n约琴夫排列:");for(i = 0; i < N; i++) printf("%d ", man[i]);alive = 2;//还有alive个人活着printf("\nL表示这%d人要放的位置:\n", alive);for(i = 0; i < N; i++) { if(man[i] > (N - alive)) printf("L");//最后还有alive个人活着,不知道还是不是继续,哈哈 else printf("D");//自杀的人 if((i+1) % 5 == 0) printf(" ");}printf("\n");
1 0
- 约瑟夫问题(Josephus Problem)算法分析及代码
- 约瑟夫问题(Josephus problem)
- 约瑟夫问题(Josephus Problem)
- 约瑟夫问题(Josephus problem)
- 约瑟夫问题(Josephus problem)
- Josephus problem(约瑟夫问题)
- 约瑟夫问题Josephus problem
- 约瑟夫环问题(josephus problem)详解
- Algorithm Gossip: 约瑟夫问题(Josephus Problem)
- 约瑟夫(Josephus problem)环问题初探
- Java-约瑟夫问题(Josephus Problem)
- 关于约瑟夫问题(Josephus Problem)
- 约瑟夫问题 The Josephus Problem 非递归算法求解
- 约瑟夫环-链表和数组表示实现及分析(Josephus Problem)
- 数据结构与算法分析 c++11 练习3.6 JosePhus 问题(Josephus problem)
- 约瑟夫(Josephus)问题
- 约瑟夫(Josephus)问题
- 约瑟夫(Josephus)问题
- vsftpd 设置root用户登陆
- Python 核心编程笔记 第三章 Python对象
- adt-bundle 不显示ant
- ubuntu 通过QT修改操作系统时间
- mysql5.6安装步骤
- 约瑟夫问题(Josephus Problem)算法分析及代码
- Learning the Yii Framework-note1
- 获得元素的绝对位置
- [设计模式]-单例模式
- C# public、protected、private
- html5学习 - video
- Java时间格式转换
- 初创公司的四个步骤
- object-c 以宏的形式定义和实现单例