단방향 연결 목록을 기반으로 Joseph 링 문제를 해결하는 PHP의 방법 소개

黄舟
풀어 주다: 2023-03-16 14:46:02
원래의
1207명이 탐색했습니다.

이 글에서는 주로 단일 연결 목록 기반의 조셉 링 문제에 대한 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 . &#39; &#39;;
  if($node->nextNode == $head) return;
  printNode($head, $node->nextNode);
}
function show($data){
  echo &#39;<pre class="brush:php;toolbar:false">&#39;;
  print_r($data);
  echo &#39;
'; } $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!