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 表单验证实现代码
Mar 10 PHP
PHP OPCode缓存 APC详细介绍
Oct 12 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
php strnatcmp()函数的用法总结
Nov 27 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
Laravel中间件实现原理详解
Oct 09 PHP
如何打开php的gd2库
Feb 09 PHP
php+ajax实现异步上传文件或图片功能
Jul 18 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
PHP chr()函数讲解
Feb 11 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 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下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
wxPython学习之主框架实例
2014/09/28 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
flask框架视图函数用法示例
2018/07/19 Python
Python global全局变量函数详解
2018/09/18 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
python增加图像对比度的方法
2019/07/12 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
大学三年的自我评价
2013/12/25 职场文书
《满井游记》教学反思
2014/02/26 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
会议室标语
2014/06/21 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
党校学习心得体会范文
2014/09/09 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
大学生党性分析材料
2014/12/19 职场文书