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的ASP防火墙
Oct 09 PHP
PHP 文章中的远程图片采集到本地的代码
Jul 30 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
Feb 16 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
PHP输出XML到页面的3种方法详解
Jun 06 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
php简单处理XML数据的方法示例
May 19 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 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 uniqid函数生成唯一ID
2015/11/18 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python中日期和时间格式化输出的方法小结
2015/03/19 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
Python是怎样处理json模块的
2020/07/16 Python
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
自考生自我鉴定范文
2013/10/01 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
补充协议书范本
2014/04/23 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
开展警示教育活动总结
2015/05/09 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
Golang 并发下的问题定位及解决方案
2022/03/16 Golang
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle