이 글에서는 주로 단일 연결 목록 기반의 조셉 링 문제에 대한 PHP의 솔루션을 소개합니다. 구체적인 예를 기반으로 조셉 링 문제를 해결하기 위해 단일 연결 목록을 사용하는 PHP의 알고리즘 원리와 관련 운영 기술을 분석합니다. 이 기사
예제에서는 PHP에서 구현된 단방향 연결 목록을 기반으로 Joseph 링 문제를 해결하는 방법을 설명합니다. 참고를 위해 모든 사람과 공유합니다. 세부 사항은 다음과 같습니다.
요셉 반지 질문: 로마인들이 초타팟을 점령한 후 39명의 유대인은 요세푸스와 그의 친구들과 함께 동굴에 숨었고 39명의 유대인은 차라리 죽기를 선택했습니다. .적에게 들키기 싫어서 자살하는 방법을 택했습니다. 41명이 원형으로 늘어서 있었는데, 세 번째 사람이 계산될 때마다 그 사람이 자살을 해야 했습니다. , 그리고 다음 사람이 모두 자살할 때까지 다시 계산했습니다. 그러나 요세푸스와 그의 친구들은 이를 따르기를 원하지 않았습니다. 먼저 한 사람부터 시작해 k-2명을 건너고(첫 번째 사람이 넘어갔기 때문에), k번째 사람을 죽인다. 그런 다음 k-1명을 지나가고 k번째 사람을 죽입니다. 이 과정은 마침내 한 사람만 남을 때까지 원을 따라 계속되며, 이 사람은 계속 살 수 있습니다. 문제는 처형을 피하기 위해 처음에 어디에 서 있는가 하는 것입니다. 요세푸스는 친구에게 먼저 순종하는 척 해달라고 부탁했고, 자신과 친구를 16위와 31위에 올려 데스게임에서 벗어났습니다.
더 유사한 문제는 다음과 같습니다. n명이 1, 2,...,n이라는 숫자로 원을 형성합니다. 이제 1부터 시작하여 순서대로 세어 m이 신고되면 m을 신고한 사람이 나가고 다음 사람이 옵니다. 1부터 다시 시작해서 순환을 계속하면서 마지막 남은 사람의 수가 몇 명인지 물어보세요.
코드 구현:
<?php class Node{ public $value; // 节点值 public $nextNode; // 下一个节点 } function create($node, $value){ $node->value = $value; } function addNode($node, $value){ $lastNode = findLastNode($node); $nextNode = new Node(); $nextNode->value = $value; $lastNode->nextNode = $nextNode; } /* 找到最后的节点 */ function findLastNode($node){ if(empty($node->nextNode)){ return $node; }else{ return findLastNode($node->nextNode); } } /* 删除节点 必须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); } } /* 节点数 */ 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 class="brush:php;toolbar:false">'; print_r($data); echo ''; } $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);
위 내용은 단방향 연결 목록을 기반으로 Joseph 링 문제를 해결하는 PHP의 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!