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入门小知识
Mar 24 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
PHP中的traits简单使用实例
May 13 PHP
php常量详细解析
Oct 27 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
PHP使用自定义方法实现数组合并示例
Jul 07 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 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
一个目录遍历函数
2006/10/09 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
Python实现不规则图形填充的思路
2020/02/02 Python
python如何实现复制目录到指定目录
2020/02/13 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
python线程里哪种模块比较适合
2020/08/02 Python
外贸公司实习自我鉴定
2013/09/24 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS