约瑟夫环问题:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

更多的类似问题是:n个人围成圈,依次编号为1,2,..,n,现在从1号开始依次报数,当报到m时,报m的人退出,下一个人重新从1报起,循环下去,问最后剩下那个人的编号是多少?

代码实现:

<?phpclass Node{public $value;      // 节点值public $nextNode;   // 下一个节点}function create($node, $value){$node->value = $value;
}function addNode($node, $value){$lastNode = findLastNode($node);$nextNode = new Node();$nextNode->value = $value;$lastNode->nextNode = $nextNode;
}/* 找到最后的节点 */
function findLastNode($node){if(empty($node->nextNode)){return $node;}else{return findLastNode($node->nextNode);}
}/* 删除节点 必须head为引用传值 */
function deleteNode(&$head, $node, $m, $k = 1){if($k + 1 == $m){if($node->nextNode == $head){$node->nextNode = $node->nextNode->nextNode;$head = $node->nextNode;return $node->nextNode;}else{$node->nextNode = $node->nextNode->nextNode;return $node->nextNode;}}else{return deleteNode($head, $node->nextNode, $m, ++$k);}
}/* 节点数 */
function countNode($head, $node, $count = 1){if($node->nextNode == $head){return $count;}else{return countNode($head, $node->nextNode, ++$count);}
}function printNode($head, $node){echo $node->value . '  ';if($node->nextNode == $head) return;printNode($head, $node->nextNode);
}function show($data){echo '<pre>';print_r($data);echo '</pre>';
}$head = new Node();
create($head, 1);addNode($head, 2);
addNode($head, 3);
addNode($head, 4);
addNode($head, 5);
addNode($head, 6);
addNode($head, 7);
addNode($head, 8);
addNode($head, 9);
addNode($head, 10);
addNode($head, 11);
addNode($head, 12);
$lastNode = findLastNode($head);
$lastNode->nextNode = $head;$count = countNode($head, $head);
$tmpHead = $head;
while ($count > 2) {$tmpHead = deleteNode($head, $tmpHead, 3, 1);$count = countNode($head, $head);
}
printNode($head, $head);

PHP实现单向链表解决约瑟夫环问题相关推荐

  1. java实现环形链表解决约瑟夫环问题

    什么是环形链表? 环形链表就是单向链表的基础上让链表的首尾相连,形成一个环,这就是一个循环链表. 什么是约瑟夫环问题? 约瑟夫环如下: 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数, ...

  2. 【Java】单循环链表解决约瑟夫环问题

    问题描述 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自 ...

  3. 第四次博客:循环单链表解决约瑟夫环问题

    #include <stdio.h> #include <stdlib.h> typedef struct aa{  int data;  struct aa *next; } ...

  4. java模拟单链表环形链表解决约瑟夫问题

    java模拟环形链表解决约瑟夫问题 此文是观看尚硅谷韩老师的数据结构与算法学习视频整理的笔记 约瑟夫问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算 ...

  5. c语言循环链表约瑟夫问题的时间复杂度,用单向循环链表解决约瑟夫问题算法优劣性分析.doc...

    用单向循环链表解决约瑟夫问题算法优劣性分析 用单向循环链表解决约瑟夫问题算法优劣性分析 摘要: 首先由简单问题引入约瑟夫问题,然后用单向循环链表解决约瑟夫问题,最后对模拟方法及数学方法的优劣性进行分析 ...

  6. 循环链表解决约瑟夫环问题

    约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? "约瑟夫环是一个数学的应用问题:已知 ...

  7. 【算法-剑指 Offer】62. 圆圈中最后剩下的数字(环形链表;约瑟夫环;动态规划)

    剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode) 发布:2021年9月12日12:18:52 问题描述及示例 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每 ...

  8. PHP解决约瑟夫环问题

    PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...

  9. 【数据结构作业—01】用单循环链表解决约瑟夫问题

    实验作业一:线性表(链表) 1. 用单循环链表解决约瑟夫问题. 问题描述: 一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务.旅行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上 ...

  10. 用链表实现约瑟夫环(没用)

    用链表实现约瑟夫环 Description 你听说过约瑟夫问题吗?问题大致如下:首先n个人围成一个圈,标记为1到n号.接着,从1号开始报数(从1开始),然后2号报数,然后3号...当有人报到到m时,这 ...

最新文章

  1. Java面试之Java基础上册(含答案)
  2. 恒丰银行深夜紧急澄清!“我行与建设银行的报道严重不实”!恒丰银行称目前自身经营稳定有序
  3. 网络测试三要素 识别 验证 认证
  4. ERWin 7.1 和7.2 的官方FTP下载地址
  5. CTR深度学习模型之 DeepFM 模型解读
  6. MVP群聊某美国公司的应聘试题(压死九个还是一个)
  7. ios 构建版本一直在处理中_iOS构建版本不显示
  8. WebLogic及其重要概念
  9. 百度黑莓宣布联手搞自动驾驶,QNX系统成Apollo平台基础
  10. php3.2接口分页,thinkphp3.2.3分页完整实例
  11. plsqldev解决中文乱码问题
  12. 【Java架构师入门到精通】架构师图谱
  13. 单点登录原理及实现方式
  14. 如何使用两台无线路由器进行无线桥接(互联)(转)
  15. N2O游戏大师 V2.36.75.803 官方安装版
  16. 大脚插件服务器金币显示,关于魔兽世界的大脚插件无法显示金钱的问题
  17. 编程英语(单词有音标)
  18. word-spacing无效
  19. Zabbix监控之从zookeeper中获取Kafka消费进度和lag
  20. 《2022元宇宙黑客松》ThreeX专场

热门文章

  1. oracle数据库xsb创建,在Linux下安装oracle数据库
  2. 不同表_一个公式搞定数据信息按类别拆分到不同工作表
  3. 修改 linux分区文件,修改分区和EXT4文件系统大小
  4. java wait 执行顺序_JAVA 的wait(), notify()与synchronized同步机制
  5. Linux栈溢出漏洞原理,盘它!PWN栈溢出漏洞。
  6. php中is upload,PHP中,文件上传
  7. ubuntu java apt-get_ubuntu apt-get 安装jdk7
  8. Javascript:利用闭包实现高级排他
  9. HTML:常用特殊字符编码表(自用)
  10. 论文笔记_S2D.14-2014-NIPS_利用多尺度深度网络从单张图像预测深度图