本文實例講述了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程序設計算法總結》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《PHP常用遍歷算法與技巧總結》及《PHP數學運算技巧總結》
希望本文所述對大家PHP程序設計有所幫助。
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。