用栈解决约瑟夫环

来源:互联网 发布:淘宝衣服商城男装 编辑:程序博客网 时间:2024/06/13 23:05

用栈解决约瑟夫环

约瑟夫环问题: 39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

<?phpclass 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)
0 0
原创粉丝点击