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脚本数据库功能详解(中)
Oct 09 PHP
PHP中10个不常见却非常有用的函数
Mar 21 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
Oct 29 PHP
PHP处理excel cvs表格的方法实例介绍
May 13 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 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
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
JavaScript效率调优经验
2009/06/04 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
python中提高pip install速度
2020/02/14 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
工程业务员岗位职责
2013/12/31 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
优秀实习生主要事迹
2014/05/29 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
中学清明节活动总结
2014/07/04 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
七年级英语教学反思
2016/02/15 职场文书
运动会主持人开幕词
2016/03/04 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
七年级作文之环保作文
2019/10/17 职场文书
关于的python五子棋的算法
2022/05/02 Python
python三子棋游戏
2022/05/04 Python