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 Squid中可缓存的动态网页设计
Sep 17 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
php使用cookie保存登录用户名的方法
Jan 26 PHP
php从csv文件读取数据并输出到网页的方法
Mar 14 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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
图书管理程序(三)
2006/10/09 PHP
php比较两个绝对时间的大小
2014/01/31 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
python 数据加密代码
2008/12/24 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
OpenCV 模板匹配
2019/07/10 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
环境科学专业个人求职信
2013/12/15 职场文书
美发店5.1活动方案
2014/01/24 职场文书
中华魂演讲稿
2014/05/13 职场文书
升国旗演讲稿
2014/09/05 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
小学数学教师研修日志
2015/11/13 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python