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 相关文章推荐
让你同时上传 1000 个文件 (一)
Oct 09 PHP
php smarty模版引擎中的缓存应用
Dec 11 PHP
openflashchart 2.0 简单案例php版
May 21 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
Feb 08 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
php实现上传图片文件代码
Jul 19 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
PHP执行shell脚本运行程序不产生core文件的方法
Dec 28 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 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
PHP6 mysql连接方式说明
2009/02/09 PHP
PHP 事件机制(2)
2011/03/23 PHP
php加密解密字符串示例
2016/10/13 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
python集合类型用法分析
2015/04/08 Python
详解Python中with语句的用法
2015/04/15 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
创新比赛获奖感言
2014/02/13 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
IT工程师岗位职责
2014/07/04 职场文书
免职证明样本
2014/10/23 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
教师聘用意向书
2015/05/11 职场文书
小英雄雨来观后感
2015/06/09 职场文书
少年犯观后感
2015/06/11 职场文书
军训新闻稿范文
2015/07/17 职场文书
关于办理居住证的介绍信模板
2019/11/27 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript