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 相关文章推荐
杏林同学录(三)
Oct 09 PHP
php下几个常用的去空、分组、调试数组函数
Feb 22 PHP
php 数组的一个悲剧?
May 11 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
Linux下创建nginx脚本-start、stop、reload…
Aug 03 PHP
php实现读取内存顺序号
Mar 29 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
Nov 10 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
Jan 10 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python3设计模式之简单工厂模式
2017/10/17 Python
python简单操作excle的方法
2018/09/12 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
keras 多gpu并行运行案例
2020/06/10 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
大学毕业生通用求职信
2013/09/28 职场文书
优秀生推荐信范文
2013/11/28 职场文书
水务局局长岗位职责
2013/11/28 职场文书
初三物理教学反思
2014/01/21 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
家属慰问信
2015/02/14 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python