PHP使用栈解决约瑟夫环问题算法示例


Posted in PHP onAugust 27, 2017

本文实例讲述了PHP使用栈解决约瑟夫环问题算法。分享给大家供大家参考,具体如下:

约瑟夫环问题: 39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

<?php
class ArrayStack
{
  private $size;
  private $stack = [];
  public function __construct(){}
  public function buildStack($num){
    $this->size = $num;
    $index = 0;
    while($index ++ < $this->size)
    {
      $this->stack[] = $index;
    }
  }
  public function pop(){
    $item = array_shift($this->stack);
    $this->size = count($this->stack);
    return $item;
  }
  public function push($item)
  {
    $this->stack[] = $item;
    $this->size = count($this->stack);
  }
  public function size()
  {
    return $this->size;
  }
  public function stack()
  {
    return $this->stack;
  }
}
interface Joseph
{
  public function handle($num = 0, $step = 0, $survivors = 0);
}
class StackJoseph implements Joseph
{
  protected $stack;
  protected $num;
  protected $step;
  public function __construct(ArrayStack $stack)
  {
    $this->stack = $stack;
  }
  public function handle($num = 0, $step = 0, $survivors = 0)
  {
    // TODO: Implement handle() method.
    $this->stack->buildStack($num);
    $i = 0;
    while($this->stack->size() > $survivors)
    {
      $pop = $this->stack->pop();
      if(($i + 1) % $step !== 0)
      {
        $this->stack->push($pop);
        $i ++;
      }
      else
      {
        $i = 0;
      }
    }
    return $this->stack->stack();
  }
}
function joseph($num, $step, $survivorsNum)
{
  $arrayStack = new ArrayStack();
  $joseph = new StackJoseph($arrayStack);
  return $joseph->handle($num, $step, $survivorsNum);
}
print_r(joseph(41, 3, 2));

执行结果:

Array
(
  [0] => 16
  [1] => 31
)

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
PHP无限分类(树形类)
Sep 28 PHP
php实现mysql数据库操作类分享
Feb 14 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
PHP冒泡算法详解(递归实现)
Nov 10 PHP
PHP中使用file_get_contents post数据代码例子
Feb 13 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 #PHP
PHP实现的简单sha1加密功能示例
Aug 27 #PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 #PHP
详解PHP swoole process的使用方法
Aug 26 #PHP
Yii2框架可逆加密简单实现方法
Aug 25 #PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 #PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 #PHP
You might like
《魔兽世界》惊魂幻象将获得调整
2020/03/08 其他游戏
smarty简单应用实例
2015/11/03 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
Python实现字典依据value排序
2016/02/24 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
django中使用POST方法获取POST数据
2019/08/20 Python
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
python代码实现图书管理系统
2020/11/30 Python
女儿十岁生日答谢词
2014/01/27 职场文书
师范生求职自荐信
2014/06/14 职场文书
六一儿童节标语
2014/10/08 职场文书
趵突泉导游词
2015/02/03 职场文书
水电施工员岗位职责
2015/04/11 职场文书
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS