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 相关文章推荐
php4的session功能评述(一)
Oct 09 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
YII实现分页的方法
Jul 09 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
php利用反射实现插件机制的方法
Mar 14 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 PHP
PHP数组array类常见操作示例
May 15 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
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
Destoon实现多表查询示例
2014/08/21 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
Python三级目录展示的实现方法
2016/09/28 Python
理解Python中的绝对路径和相对路径
2017/08/30 Python
简单了解django orm中介模型
2019/07/30 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
武汉某公司的C#笔试题面试题
2015/12/25 面试题
医科大学生的自我评价
2013/12/04 职场文书
保密普查工作实施方案
2014/02/25 职场文书
三年级小学生评语
2014/04/22 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
具结保证书
2015/01/17 职场文书
个人政治思想总结
2015/03/05 职场文书
道歉信怎么写
2015/05/12 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
四十九个javascript小知识实用技巧
2021/11/20 Javascript