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 self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
php页面缓存ob系列函数介绍
Oct 18 PHP
php静态文件生成类实例分析
Jan 03 PHP
Zend Framework入门知识点小结
Mar 19 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
php微信公众号开发之图片回复
Oct 20 PHP
PHP异常类及异常处理操作实例详解
Dec 19 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 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三维数组去重(示例代码)
2013/11/26 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
python检测远程端口是否打开的方法
2015/03/14 Python
python多进程控制学习小结
2018/10/31 Python
django admin组件使用方法详解
2019/07/19 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
讲解员培训方案
2014/05/04 职场文书
2014年部门工作总结
2014/11/12 职场文书
表扬通报怎么写
2015/01/16 职场文书
技术支持岗位职责
2015/02/13 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电