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
PHP5中使用DOM控制XML实现代码
May 07 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
PHP魔术方法使用方法汇总
Feb 14 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
PHP7 list() 函数修改
Mar 09 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实现维护文件代码
2007/06/14 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
Display SQL Server Version Information
2007/06/21 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
python实现从wind导入数据
2019/12/03 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
用python读取xlsx文件
2020/12/17 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
医学院护理专业应届生求职信
2013/11/12 职场文书
服务员自我评价
2014/01/25 职场文书
经典安踏广告词
2014/03/21 职场文书
五一劳动节活动记录
2014/03/23 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
初三学习计划书范文
2014/04/30 职场文书
欢迎领导检查标语
2014/06/27 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
机器人总动员观后感
2015/06/09 职场文书
在职证明范本
2015/06/15 职场文书