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实现Socket服务器的代码
Apr 03 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
探讨PHP删除文件夹的三种方法
Jun 09 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
合格的PHP程序员必备技能
Nov 13 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 PHP
基于PHP实现微信小程序客服消息功能
Aug 12 PHP
基于Laravel 多个中间件的执行顺序详解
Oct 21 PHP
tp5框架的增删改查操作示例
Oct 31 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
php下拉选项的批量操作的实现代码
2013/10/14 PHP
浅谈php7的重大新特性
2015/10/23 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
初学JavaScript第二章
2008/09/30 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
Json解析的方法小结
2016/06/22 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
使用Python生成url短链接的方法
2015/05/04 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
中秋节超市促销方案
2014/01/30 职场文书
小学生秋游活动方案
2014/02/23 职场文书
创先争优承诺书范文
2014/03/31 职场文书
秋天的图画教学反思
2014/05/01 职场文书
同志主要表现材料
2014/08/21 职场文书
学校政风行风评议心得体会
2014/10/21 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书