天天看點

PHP實作約瑟夫環

題目:有17個人圍成一圈(編号0~16),從第0号的人開始從1報數,凡報到3的倍數的人離開圈子,然後再數下去,直到最後隻剩下一個人為止,問此人原來的位置是多少号?

思想:1.設定數組,把這些人按照編号存入數組,且加一個标記位,0代表沒有被移出,1代表移出。

           2.執行無限循環,在每一次循環中,對整個數組進行周遊,判斷每個數組元素的标記為是否為0,如果為0則繼續報數,如果此數能被3整除,該數組元素标記位設為1,并且移出的總人數+1。當移出總人數達到16人,則break退出無限循環,剩下的為勝者。

代碼:

<?php

$person = array
(
    array("0",0),
    array("1",0),
    array("2",0),
    array("3",0),
    array("4",0),
    array("5",0),
    array("6",0),
    array("7",0),
    array("8",0),
    array("9",0),
    array("10",0),
    array("11",0),
    array("12",0),
    array("13",0),
    array("14",0),
    array("15",0),
    array("16",0),

);

    //報數
    $j = 0;

    //移出位人數
    $num = 0;

        //執行循環
        while(1)
        {
            //周遊整個數組
            for($k=0;$k<17;$k++)
            {
                //如果此數組元素沒有移出位
                if($person[$k][1]==0)
                {
                    //此數組元素繼續報數
                    $j=$j+1;

                    //如果報的數能被3整除
                    if($j%3==0)
                    {
                        //此數組元素标記移出位
                        $person[$k][1]=1;

                        //出位人數+1
                        $num=$num+1;
                    }


                }
            }

            //如果出位人數達到16人,則最後一人獲勝,退出循環
            if($num==16)
            {
                break;
            }

        }

      var_dump($person) ;

?>      

結果:

array (size=17)
  0 => 
    array (size=2)
      0 => string '0' (length=1)
      1 => int 1
  1 => 
    array (size=2)
      0 => string '1' (length=1)
      1 => int 1
  2 => 
    array (size=2)
      0 => string '2' (length=1)
      1 => int 1
  3 => 
    array (size=2)
      0 => string '3' (length=1)
      1 => int 1
  4 => 
    array (size=2)
      0 => string '4' (length=1)
      1 => int 1
  5 => 
    array (size=2)
      0 => string '5' (length=1)
      1 => int 1
  6 => 
    array (size=2)
      0 => string '6' (length=1)
      1 => int 1
  7 => 
    array (size=2)
      0 => string '7' (length=1)
      1 => int 1
  8 => 
    array (size=2)
      0 => string '8' (length=1)
      1 => int 1
  9 => 
    array (size=2)
      0 => string '9' (length=1)
      1 => int 1
  10 => 
    array (size=2)
      0 => string '10' (length=2)
      1 => int 0
  11 => 
    array (size=2)
      0 => string '11' (length=2)
      1 => int 1
  12 => 
    array (size=2)
      0 => string '12' (length=2)
      1 => int 1
  13 => 
    array (size=2)
      0 => string '13' (length=2)
      1 => int 1
  14 => 
    array (size=2)
      0 => string '14' (length=2)
      1 => int 1
  15 => 
    array (size=2)
      0 => string '15' (length=2)
      1 => int 1
  16 => 
    array (size=2)
      0 => string '16' (length=2)
      1 => int 1      

10号位的人為所求解