1. 程式人生 > >約瑟夫環問題(猴子選大王)PHP版

約瑟夫環問題(猴子選大王)PHP版

n) 構造 一個數 UNC turn 編號 來歷 while params

約瑟夫斯問題問題有時候也被描述成猴子選大王問題,題目如下。(最後會貼上約瑟夫問題的來歷)

一群猴子排成一圈,按1,2,…,n依次編號。

然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最後只剩下一只猴子為止,那只猴子就叫做大王。

要求編程模擬此過程,輸入m、n, 輸出最後那個大王的編號。

用程序模擬該過程,代碼如下:

<?php
function monkeyKing($n, $m)
{
    $arr = range(1, $n);       //構造一個數組
    $i = 1;                         //從第一個開始循環

    while (count($arr) > 1) {       //如果總數大於1
        if ($i % $m != 0) {
            $arr[] = $arr[$i - 1];  //不被踢出則壓入數組尾部
        }
        unset($arr[$i - 1]);        //壓入數組然後刪除
        $i++;                       //繼續循環
    }

    return $arr[$i - 1];            //直至最後剩下一個為大王
}



print_r(monkeyKing(5, 3));         //第4只為大王




$n = 5
 $m = 3
 $arr = [1, 2, 3, 4, 5]

 $i   $arr
 ---+------------------------
 1    x 2 3 4 5 1
 2    x x 3 4 5 1 2
>3    x x x 4 5 1 2
 4    x x x x 5 1 2 4
 5    x x x x x 1 2 4 5
>6    x x x x x x 2 4 5
 7    x x x x x x x 4 5 2
 8    x x x x x x x x 5 2 4
>9    x x x x x x x x x 2 4
 10   x x x x x x x x x x 4 2
 11   x x x x x x x x x x x 2 4
>12   x x x x x x x x x x x x 4

約瑟夫環問題(猴子選大王)PHP版