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 相关文章推荐
推荐文章系统(一)
Oct 09 PHP
消息持续发送的完整例子
Oct 09 PHP
建立动态的WML站点(二)
Oct 09 PHP
我的论坛源代码(三)
Oct 09 PHP
PHP实现定时生成HTML网站首页实例代码
Nov 20 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
Oct 08 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 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
文章推荐系统(三)
2006/10/09 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
解决DataFrame排序sort的问题
2018/06/07 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
基于python实现雪花算法过程详解
2019/11/16 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
学生就业推荐信
2013/11/13 职场文书
环保倡议书
2014/04/14 职场文书
节能宣传周活动总结
2014/05/08 职场文书
工作检讨书大全
2015/01/26 职场文书