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 静态页面中显示动态内容
Aug 14 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
php+mysql实现的二级联动菜单效果详解
May 10 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
PHP程序守护进程化实现方法详解
Jul 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
PHP安全技术之 实现php基本安全
2010/09/04 PHP
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
php读取目录所有文件信息dir示例
2014/03/18 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
Javascript之文件操作
2007/03/07 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
AngularJS语法详解
2015/01/23 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
详解Python locals()的陷阱
2019/03/26 Python
Django 多环境配置详解
2019/05/14 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
Pytorch之parameters的使用
2019/12/31 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
后勤自我鉴定
2013/10/13 职场文书
银行个人求职自荐信范文
2013/12/16 职场文书
机关财务管理制度
2014/01/17 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
银行求职信范文
2014/05/26 职场文书
检讨书格式范文
2015/05/07 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
小学中队长竞选稿
2015/11/20 职场文书
竞选稿之小学班干部
2019/10/31 职场文书