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 超链接 抓取实现代码
Jun 29 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
php define的第二个参数使用方法
Nov 04 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
Feb 03 PHP
php去除二维数组的重复项方法
Nov 03 PHP
详解Yii2.0使用AR联表查询实例
Jun 16 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 PHP
PHP isset()及empty()用法区别详解
Aug 29 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
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
PHP 中常量的知识整理
2017/04/14 PHP
JS小框架 fly javascript framework
2009/11/26 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
Javascript 中创建自定义对象的方法汇总
2014/12/04 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
[03:08]Ti4观战指南上
2014/07/07 DOTA
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
Python标准库之Sys模块使用详解
2015/05/23 Python
Python字符串格式化
2015/06/15 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Python中作用域的深入讲解
2018/12/10 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
留学推荐信写作指南
2014/01/25 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
中学政教处工作总结
2015/08/13 职场文书