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列出一个目录下的所有文件的代码
Oct 09 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
Jun 18 PHP
php生成短网址示例
May 05 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
php文件上传、下载和删除示例
Aug 28 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP设计模式之工厂模式定义与用法详解
Apr 03 PHP
php实现简易计算器
Aug 28 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下网站防IP攻击代码,超级实用
2010/10/24 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php实现搜索类封装示例
2016/03/31 PHP
js 通用javascript函数库整理
2011/08/14 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Python实现求数列和的方法示例
2018/01/12 Python
python3解析库lxml的安装与基本使用
2018/06/27 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
python编写猜数字小游戏
2019/10/06 Python
python下载库的步骤方法
2019/10/12 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
金融专业个人求职信范文
2013/11/28 职场文书
寄语是什么意思
2014/04/10 职场文书
大学生新学期计划书
2014/04/28 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
民间借贷协议书范本
2014/10/01 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
2015年党性分析材料
2014/12/19 职场文书
节水倡议书
2015/01/19 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript