PHP实现的基于单向链表解决约瑟夫环问题示例


Posted in PHP onSeptember 30, 2017

本文实例讲述了PHP实现的基于单向链表解决约瑟夫环问题。分享给大家供大家参考,具体如下:

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

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

代码实现:

<?php
class 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程序设计有所帮助。

PHP 相关文章推荐
聊天室php&amp;mysql(五)
Oct 09 PHP
PHP实现用户认证及管理完全源码
Mar 11 PHP
php foreach 参数强制类型转换的问题
Dec 10 PHP
多个PHP中文字符串截取函数
Nov 12 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
php绘图之加载外部图片的方法
Jan 24 PHP
PHP中通过trigger_error触发PHP错误示例
Jun 23 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
PHP 接入支付宝即时到账功能
Sep 18 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
Sep 30 #PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 #PHP
php使用curl下载指定大小的文件实例代码
Sep 30 #PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 #PHP
PHP 获取 ping 时间的实现方法
Sep 29 #PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 #PHP
PHP使用PDO访问oracle数据库的步骤详解
Sep 29 #PHP
You might like
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
js传值 判断
2006/10/26 Javascript
用JS剩余字数计算的代码
2008/07/03 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
用Python实现命令行闹钟脚本实例
2016/09/05 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
python绘制多个曲线的折线图
2020/03/23 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
python线程信号量semaphore使用解析
2019/11/30 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
python能开发游戏吗
2020/06/11 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
事业单位个人应聘自荐信
2013/09/21 职场文书
后勤工作职责
2013/12/22 职场文书
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
Nginx反向代理、重定向
2022/04/13 Servers