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 相关文章推荐
文件系统基本操作类
Nov 23 PHP
PHP常用技巧总结(附函数代码)
Feb 04 PHP
PHP 文件系统详解
Sep 13 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 PHP
Yii分页用法实例详解
Dec 04 PHP
php三元运算符知识汇总
Jul 02 PHP
php实现的递归提成方案实例
Nov 14 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
Laravel 数据库加密及数据库表前缀配置方法
Oct 10 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
长波有什么东西
2021/03/01 无线电
使用GD库生成带阴影文字的图片
2015/03/27 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
JavaScript 参考教程
2006/12/29 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
javascript模块化简单解析
2016/04/07 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
angularjs 缓存的使用详解
2018/03/19 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
详解python3百度指数抓取实例
2016/12/12 Python
Python模拟三级菜单效果
2017/09/11 Python
python代码实现ID3决策树算法
2017/12/20 Python
django富文本编辑器的实现示例
2019/04/10 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
《商鞅南门立木》教学反思
2014/02/16 职场文书
小学生学习感言
2014/03/10 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
募捐倡议书
2014/04/14 职场文书
社区两委对照检查材料
2014/08/23 职场文书
法定代表人资格证明书
2014/09/11 职场文书
英语演讲开场白
2015/05/29 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android