PHP實(shí)現(xiàn)的基于單向鏈表解決約瑟夫環(huán)問題示例
本文實(shí)例講述了PHP實(shí)現(xiàn)的基于單向鏈表解決約瑟夫環(huán)問題。分享給大家供大家參考,具體如下:
約瑟夫環(huán)問題:在羅馬人占領(lǐng)喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數(shù),每報數(shù)到第3人該人就必須自殺,然后再由下一個重新報數(shù),直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因?yàn)榈谝粋€人已經(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)下去,問最后剩下那個人的編號是多少?
代碼實(shí)現(xiàn):
<?php
class Node{
public $value; // 節(jié)點(diǎn)值
public $nextNode; // 下一個節(jié)點(diǎn)
}
function create($node, $value){
$node->value = $value;
}
function addNode($node, $value){
$lastNode = findLastNode($node);
$nextNode = new Node();
$nextNode->value = $value;
$lastNode->nextNode = $nextNode;
}
/* 找到最后的節(jié)點(diǎn) */
function findLastNode($node){
if(empty($node->nextNode)){
return $node;
}else{
return findLastNode($node->nextNode);
}
}
/* 刪除節(jié)點(diǎn) 必須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é)點(diǎn)數(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è)計(jì)入門教程》、《php字符串(string)用法總結(jié)》及《php程序設(shè)計(jì)算法總結(jié)》
希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。
- php解決約瑟夫環(huán)示例
- 約瑟夫環(huán)問題的PHP實(shí)現(xiàn) 使用PHP數(shù)組內(nèi)部指針操作函數(shù)
- PHP使用棧解決約瑟夫環(huán)問題算法示例
- PHP實(shí)現(xiàn)約瑟夫環(huán)問題的方法分析
- PHP基于遞歸實(shí)現(xiàn)的約瑟夫環(huán)算法示例
- php基于環(huán)形鏈表解決約瑟夫環(huán)問題示例
- php實(shí)現(xiàn)約瑟夫問題的方法小結(jié)
- php約瑟夫問題解決關(guān)于處死犯人的算法
- PHP基于關(guān)聯(lián)數(shù)組20行代碼搞定約瑟夫問題示例
- php使用環(huán)形鏈表解決約瑟夫問題完整示例
- php解決約瑟夫環(huán)算法實(shí)例分析
相關(guān)文章
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
這篇文章主要為大家詳細(xì)介紹了PHP5.5.15、Apache2.4.10和MySQL5.6.20配置方法,感興趣的小伙伴們可以參考一下2016-05-05
php數(shù)據(jù)入庫前清理 注意php intval與mysql的int取值范圍不同
php數(shù)據(jù)入庫前清理 注意php intval與mysql的int取值范圍不同,需要的朋友可以參考下。2010-12-12
php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法
這篇文章主要介紹了php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法,通過一個自定義php方法實(shí)現(xiàn)模擬joson中文不轉(zhuǎn)義,具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01
PHP實(shí)現(xiàn)通過Luhn算法校驗(yàn)信用卡卡號是否有效
這篇文章主要介紹了PHP實(shí)現(xiàn)通過Luhn算法校驗(yàn)信用卡卡號是否有效,實(shí)例分析了php實(shí)現(xiàn)Luhn算法及相關(guān)應(yīng)用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
php PDO實(shí)現(xiàn)的事務(wù)回滾示例
這篇文章主要介紹了php PDO實(shí)現(xiàn)的事務(wù)回滾功能,結(jié)合具體實(shí)例形式分析了php基于PDO操作實(shí)現(xiàn)事務(wù)回滾功能的相關(guān)SQL語句與操作技巧,需要的朋友可以參考下2017-03-03
淺談php字符串反轉(zhuǎn) 面試中經(jīng)常遇到
下面小編就為大家分享一篇淺談php字符串反轉(zhuǎn) 面試中經(jīng)常遇到的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

