1. 程式人生 > >php解決約瑟夫問題

php解決約瑟夫問題

“約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去…,如此不停的進行下去, 直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模擬此過程,輸入m、n, 輸出最後那個大王的編號。

下面列出了三種用PHP來解決此問題的方法:

  1. 按邏輯依次去除
  2. 遞迴演算法
  3. 線性表應用

方法一,按照邏輯依次去除

  1. function getKingMokey($n$m)  
  2. {  
  3.     $monkey[0] = 0;  
  4.     //將1-n只猴子順序編號 入陣列中
  5.     for
    ($i= 1; $i<= $n$i++)   
  6.     {   
  7.         $monkey[$i] = $i;  
  8.     }  
  9.     $len = count($monkey);  
  10.     //迴圈遍歷陣列元素(猴子編號)
  11.     for($i= 0; $i$len$i$i)  
  12.     {  
  13.         $num = 0;  
  14.         /* 
  15.          * 遍歷$monkey陣列,計算陣列中值不為0的元素個數(剩餘猴子的個數) 
  16.          * 賦值為$num,並獲取值不為0的元素的元素值 
  17.         */
  18.         foreach
    ($monkeyas$key => $value)   
  19.         {   
  20.            if($value == 0) continue;   
  21.            $num++;   
  22.            $values = $value;   
  23.         }  
  24.         //若只剩一隻猴子 則輸出該猴子編號(陣列元素值) 並退出迴圈 
  25.         if($num == 1)   
  26.         {   
  27.             return$values;  
  28.             exit;   
  29.         }  
  30.         /*  
  31.          * 若剩餘猴子數大於1($num > 1)  
  32.          * 繼續程式  
  33.         */
  34.         //將第$i只猴子踢出隊伍(相應陣列位置元素值設為0) 
  35.         $monkey[$i] = 0;  
  36.         /* 
  37.          * 獲取下一隻需要踢出隊伍的猴子編號 
  38.          * 在$m值範圍內遍歷猴子 並設定$m的計數器 
  39.          * 依次取下一猴子編號 
  40.          * 若元素值為0,則該位置的猴子已被踢出隊伍 
  41.          * 若不為0,繼續獲取下一猴子編號,且計數器加1 
  42.          * 若取得的猴子編號大於陣列個數 
  43.          * 則從第0只猴子開始遍歷(陣列指標歸零) 步驟同上 
  44.          * 直到計數器到達$m值 * 最後獲取的$i值即為下一隻需要踢出隊伍的猴子編號 
  45.          */
  46.         //設定計數器 
  47.         for($j= 1; $j<= $m$j++)   
  48.         {   
  49.             //猴子編號加一,遍歷下一隻猴子 
  50.             $i++;  
  51.             //若該猴子未被踢出隊伍,獲取下一隻猴子編號 
  52.             if($monkey[$i] > 0) continue;  
  53.             //若元素值為0,則猴子已被踢出隊伍,進而迴圈取下一隻猴子編號 
  54.             if($monkey[$i] == 0)   
  55.             {   
  56.                 //取下一隻猴子編號 
  57.                 for($k$i$k$len$k++)  
  58.                 {   
  59.                     //值為0,編號加1 
  60.                     if($monkey[$k] == 0) $i++;  
  61.                     //否則,編號已取得,退出 
  62.                     if($monkey[$k] > 0) break;  
  63.                 }   
  64.              }  
  65.             //若編號大於猴子個數,則從第0只猴子開始遍歷(陣列指標歸零) 步驟同上 
  66.             if($i == $len$i = 0;  
  67.             //同上步驟,獲取下一隻猴子編號
  68.             if($monkey[$i] == 0)   
  69.             {   
  70.                 for($k$i$k$len$k++)   
  71.                 {  
  72.                     if($monkey[$k] == 0) $i++;  
  73.                     if($monkey[$k] > 0) break;  
  74.                 }   
  75.             }   
  76.         }  
  77.     }  
  78. }  
  79. //猴子個數 
  80. $n = 10;  
  81. //踢出隊伍的編號間隔值 
  82. $m = 3;  
  83. //呼叫猴王獲取函式
  84. echo getKingMokey($n$m)."是猴王";  
方法二,遞迴演算法
  1. function killMonkey($monkeys , $m , $current = 0){  
  2.     $number = count($monkeys);  
  3.     $num = 1;  
  4.     if(count($monkeys) == 1){  
  5.         echo$monkeys[0]."成為猴王了";  
  6.         return;  
  7.     }  
  8.     else{  
  9.         while($num++ < $m){  
  10.             $current++ ;  
  11.             $current = $current%$number;  
  12.         }  
  13.         echo$monkeys[$current]."的猴子被踢掉了<br/>";  
  14.         array_splice($monkeys , $current , 1);  
  15.         killMonkey($monkeys , $m , $current);  
  16.     }  
  17. }  
  18. $monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkeys的編號
  19. $m = 3; //數到第幾只猴子被踢出
  20. killMonkey($monkeys , $m);  


方法三,線性表應用
  1. function yuesefu($n,$m) {    
  2. 相關推薦

    PHP解決環的問題

    //準備好41個人 $people = array(); for($i=0;$i<=40;$i++) { $people[] = $i+1; } /** * @param $people 準備好的陣列 * @param $step 每到第幾個人,會把他殺掉 * @p

    php解決

    轉載 https://www.cnblogs.com/china90/p/7367396.html 今天偶遇一道演算法題 “約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它

    php解決問題

    “約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去…,如此不停的進行下去, 直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模擬此過程,輸入m

    php通過迴圈鏈解決

    本想著用php寫些資料結構提升一下,寫到鏈的時候看到約瑟夫環問題,嘗試用迴圈鏈寫了一下 約瑟夫環: 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又

    用循環鏈表解決環問題

    循環 解決 使用 end head als list output 循環條件 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規

    循環鏈表解決問題

    lin .cn 尾插 span list str clas amp data   訓練一下尾插法和循環鏈表的使用。 //循環鏈表解決約瑟夫問題 #include <stdio.h> #include <stdlib.h> typedef struc

    單循環鏈表 解決環的問題

    malloc 表示 重復 printf 約瑟夫 ext std head eof 已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的

    用迴圈連結串列解決環的問題

    約瑟夫環問題簡介  約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出

    C語言利用迴圈單鏈表解決問題

    Description  編號是1,2,……,n的n個人按照順時針方向圍坐一圈,每個人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他的順時針方向的下一個人開始重新從1報

    資料結構--迴圈佇列解決問題(純c)

    #ifndef __JOSEPHUS_H__ #define __JOSEPHUS_H__ #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef int QEl

    C語言解決環問題 詳細註釋

    約瑟夫環演算法是: n 個人圍成一圈,每個人都有一個互不相同的密碼,該密碼是一個整數值,選擇一個人作為起點,然後順時針從 1 到 k(k為起點人手中的密碼值)數數。數到 k 的人退出圈子,然後從下一個人開始繼續從 1 到 j (j為剛退出圈子的人的密碼)數數,數到 j 的人退

    連結串列解決環問題

    第一次做約瑟夫環問題,歡迎大家來找茬~ 如果做單迴圈連結串列時有點暈了,要畫圖要畫圖要畫圖,重要的事講三遍,因為真的是很好的方法。 #include<stdio.h> #include<stdlib.h> typedef struc

    使用連結串列解決環的問題

    已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列,問最後一個出環的人的原編號。 用在單鏈表中刪除一個結點的思想

    使用連結串列解決環問題

    1139 約瑟夫環問題 時間限制:500MS 記憶體限制:65536K 提交次數:157 通過次數:79 題型: 程式設計題 語言: G++;GCC Description 約瑟夫(josephus)環是這樣的:假設有n個小孩圍坐成一個圓圈,並從1開始依次

    URAL 1521 War Games 2 樹狀陣列解決環,輸出離隊順序

    In accordance with this scheme, the war games are divided into N phases; and N soldiers, successively numbered from 1 to N, are marching round a circle on

    C語言解決問題演算法

    據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,4

    靜態連結串列解決環問題

    #include<stdio.h> #define MAXSIZE 100  struct {  int  cur ;  int  number;  int  secret_node; }space[MAXSIZE]; int main(void) {  int

    (學習java)用java語言構造的迴圈連結串列解決問題

    //josephus問題 41個人1-3報數,數到3的自殺,最後剩餘的2個人結點資料 public class Josephus { public static void main(String[] args) { SLineList s = new SLineLis

    利用陣列解決環問題

    約瑟夫環問題描述:編號為1,2… n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數的上限值m,從第一個人開始按順時針方向自1開始順序報數, 報到m時停止報數,報m的人出列,將他的密碼作為新的m值,從他的順時針方向上的下一個開始重新從1報數,如此下去,直至所有人全部出列為

    【年前最後一波裝逼】記一次阿里面試,我是如何用一行程式碼解決環問題的

    約瑟夫環問題算是很經典的題了,估計大家都聽說過,然後我就在一次筆試中遇到了,下面我就用 3 種方法來詳細講解一下這道題,最後一種方法學了之後保證讓你可以讓你裝逼。 問題描述:編號為 1-N 的 N 個士兵圍坐在一起形成一個圓圈,從編號為 1 的士兵開始依次報數(1,2,3...這樣依次報),數到 m 的 士