PHP實(shí)現(xiàn)的基于單向鏈表解決約瑟夫環(huán)問題示例
本文實(shí)例講述了PHP實(shí)現(xiàn)的基于單向鏈表解決約瑟夫環(huán)問題。分享給大家供大家參考,具體如下:
約瑟夫環(huán)問題:在羅馬人占領(lǐng)喬塔帕特后,39 個(gè)猶太人與Josephus及他的朋友躲到一個(gè)洞中,39個(gè)猶太人決定寧愿死也不要被敵人抓到,于是決定了一個(gè)自殺方式,41個(gè)人排成一個(gè)圓圈,由第1個(gè)人開始報(bào)數(shù),每報(bào)數(shù)到第3人該人就必須自殺,然后再由下一個(gè)重新報(bào)數(shù),直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個(gè)人開始,越過k-2個(gè)人(因?yàn)榈谝粋€(gè)人已經(jīng)被越過),并殺掉第k個(gè)人。接著,再越過k-1個(gè)人,并殺掉第k個(gè)人。這個(gè)過程沿著圓圈一直進(jìn)行,直到最終只剩下一個(gè)人留下,這個(gè)人就可以繼續(xù)活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個(gè)與第31個(gè)位置,于是逃過了這場(chǎng)死亡游戲。
更多的類似問題是:n個(gè)人圍成圈,依次編號(hào)為1,2,..,n,現(xiàn)在從1號(hào)開始依次報(bào)數(shù),當(dāng)報(bào)到m時(shí),報(bào)m的人退出,下一個(gè)人重新從1報(bào)起,循環(huán)下去,問最后剩下那個(gè)人的編號(hào)是多少?
代碼實(shí)現(xiàn):
<?php
class Node{
public $value; // 節(jié)點(diǎn)值
public $nextNode; // 下一個(gè)節(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é)》
希望本文所述對(duì)大家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)文章
PHP實(shí)現(xiàn)的函數(shù)重載功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的函數(shù)重載功能,結(jié)合實(shí)例形式分析了php面向?qū)ο蟪绦蛟O(shè)計(jì)中使用__call方法的重載及構(gòu)造函數(shù)重載相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08
PHP循環(huán)與分支知識(shí)點(diǎn)梳理
涉及到一些比較復(fù)雜的邏輯,分支與循環(huán)是必不可少的。通過分支和循環(huán)的結(jié)合使用可以使業(yè)務(wù)更加復(fù)雜,代碼功能更加強(qiáng)大,這篇文章主要介紹了PHP循環(huán)與分支知識(shí)點(diǎn)2022-11-11
PHP中的閉包function()?use()?{}使用場(chǎng)景和技巧
由于存在函數(shù)內(nèi)部不能訪問全局作用的,所以就需要一種可以引入上一級(jí)作用域的語法結(jié)構(gòu),可以通過use使用函數(shù)聲明時(shí)所在作用域的變量的值。php的閉包可能不常用,但是在某些場(chǎng)合之下還是可以考慮用php的閉包來實(shí)現(xiàn)某些功能的。2022-12-12
php獲取通過http協(xié)議post提交過來xml數(shù)據(jù)及解析xml
php 如何獲取請(qǐng)求的xml數(shù)據(jù),對(duì)方通過http協(xié)議post提交過來xml數(shù)據(jù),php如何獲取到這些數(shù)據(jù)呢?2012-12-12
php array_slice函數(shù)的使用以及參數(shù)詳解
array array_slice ( array array, int offset [, int length]),根據(jù) offset 和 length 參數(shù)所指定的 array 數(shù)組中的一段序列。offset 表示開始位置,length表示這段序列的長(zhǎng)度.2008-08-08
php抽獎(jiǎng)小程序的實(shí)現(xiàn)代碼
本篇文章是對(duì)php實(shí)現(xiàn)抽獎(jiǎng)的程序代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP標(biāo)準(zhǔn)類(stdclass)用法示例
這篇文章主要介紹了PHP標(biāo)準(zhǔn)類(stdclass)用法,結(jié)合實(shí)例形式分析了php內(nèi)置標(biāo)準(zhǔn)類的原理與使用方法,需要的朋友可以參考下2016-09-09

