PHP實現(xiàn)的基于單向鏈表解決約瑟夫環(huán)問題示例
本文實例講述了PHP實現(xiàn)的基于單向鏈表解決約瑟夫環(huán)問題。分享給大家供大家參考,具體如下:
約瑟夫環(huán)問題:在羅馬人占領(lǐng)喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數(shù),每報數(shù)到第3人該人就必須自殺,然后再由下一個重新報數(shù),直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經(jīng)被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進(jìn)行,直到最終只剩下一個人留下,這個人就可以繼續(xù)活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。
更多的類似問題是:n個人圍成圈,依次編號為1,2,..,n,現(xiàn)在從1號開始依次報數(shù),當(dāng)報到m時,報m的人退出,下一個人重新從1報起,循環(huán)下去,問最后剩下那個人的編號是多少?
代碼實現(xiàn):
<?php class Node{ public $value; // 節(jié)點值 public $nextNode; // 下一個節(jié)點 } function create($node, $value){ $node->value = $value; } function addNode($node, $value){ $lastNode = findLastNode($node); $nextNode = new Node(); $nextNode->value = $value; $lastNode->nextNode = $nextNode; } /* 找到最后的節(jié)點 */ function findLastNode($node){ if(empty($node->nextNode)){ return $node; }else{ return findLastNode($node->nextNode); } } /* 刪除節(jié)點 必須head為引用傳值 */ function deleteNode(&$head, $node, $m, $k = 1){ if($k + 1 == $m){ if($node->nextNode == $head){ $node->nextNode = $node->nextNode->nextNode; $head = $node->nextNode; return $node->nextNode; }else{ $node->nextNode = $node->nextNode->nextNode; return $node->nextNode; } }else{ return deleteNode($head, $node->nextNode, $m, ++$k); } } /* 節(jié)點數(shù) */ function countNode($head, $node, $count = 1){ if($node->nextNode == $head){ return $count; }else{ return countNode($head, $node->nextNode, ++$count); } } function printNode($head, $node){ echo $node->value . ' '; if($node->nextNode == $head) return; printNode($head, $node->nextNode); } function show($data){ echo '<pre>'; print_r($data); echo '</pre>'; } $head = new Node(); create($head, 1); addNode($head, 2); addNode($head, 3); addNode($head, 4); addNode($head, 5); addNode($head, 6); addNode($head, 7); addNode($head, 8); addNode($head, 9); addNode($head, 10); addNode($head, 11); addNode($head, 12); $lastNode = findLastNode($head); $lastNode->nextNode = $head; $count = countNode($head, $head); $tmpHead = $head; while ($count > 2) { $tmpHead = deleteNode($head, $tmpHead, 3, 1); $count = countNode($head, $head); } printNode($head, $head);
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》及《php程序設(shè)計算法總結(jié)》
希望本文所述對大家PHP程序設(shè)計有所幫助。
- php解決約瑟夫環(huán)示例
- 約瑟夫環(huán)問題的PHP實現(xiàn) 使用PHP數(shù)組內(nèi)部指針操作函數(shù)
- PHP使用棧解決約瑟夫環(huán)問題算法示例
- PHP實現(xiàn)約瑟夫環(huán)問題的方法分析
- PHP基于遞歸實現(xiàn)的約瑟夫環(huán)算法示例
- php基于環(huán)形鏈表解決約瑟夫環(huán)問題示例
- php實現(xiàn)約瑟夫問題的方法小結(jié)
- php約瑟夫問題解決關(guān)于處死犯人的算法
- PHP基于關(guān)聯(lián)數(shù)組20行代碼搞定約瑟夫問題示例
- php使用環(huán)形鏈表解決約瑟夫問題完整示例
- php解決約瑟夫環(huán)算法實例分析
相關(guān)文章
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
這篇文章主要為大家詳細(xì)介紹了PHP5.5.15、Apache2.4.10和MySQL5.6.20配置方法,感興趣的小伙伴們可以參考一下2016-05-05php數(shù)據(jù)入庫前清理 注意php intval與mysql的int取值范圍不同
php數(shù)據(jù)入庫前清理 注意php intval與mysql的int取值范圍不同,需要的朋友可以參考下。2010-12-12php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法
這篇文章主要介紹了php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法,通過一個自定義php方法實現(xiàn)模擬joson中文不轉(zhuǎn)義,具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01PHP實現(xiàn)通過Luhn算法校驗信用卡卡號是否有效
這篇文章主要介紹了PHP實現(xiàn)通過Luhn算法校驗信用卡卡號是否有效,實例分析了php實現(xiàn)Luhn算法及相關(guān)應(yīng)用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03淺談php字符串反轉(zhuǎn) 面試中經(jīng)常遇到
下面小編就為大家分享一篇淺談php字符串反轉(zhuǎn) 面試中經(jīng)常遇到的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01