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数组的使用方法小结
Sep 23 PHP
PHP写杨辉三角实例代码
Jul 17 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
深入PHP autoload机制的详解
Jun 09 PHP
基于php iconv函数的使用详解
Jun 09 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 PHP
PHP中的output_buffering详细介绍
Sep 27 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
浅谈PHP进程管理
Mar 08 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
Oct 18 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
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
Node.js实现文件上传
2016/07/05 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
优化Vue中date format的性能详解
2020/01/13 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
python 同时运行多个程序的实例
2019/01/07 Python
django 类视图的使用方法详解
2019/07/24 Python
python获取Linux发行版名称
2019/08/30 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
事业单位辞职信范文
2014/01/19 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
丧事主持词大全
2014/04/02 职场文书
个人专业技术总结
2015/03/05 职场文书