用PHP實現丟手帕問題(約瑟夫問題)

2021-08-16 14:57:12 字數 1486 閱讀 4423

問題描述:有n個人圍成一圈,然後從任意指定的乙個 人那裡為起點,以m個人為單位,每轉m個人第m個人被殺死。求最後不會被殺死的人。

遺留問題:

在此用php做簡單的實現,php中對遞迴有100次的深度限制,所以在此不用遞迴,用迴圈;php中處理陣列的函式比較多,所以採用順序表(陣列),順序表刪除元素比較複雜,所以效率比較低,只能處理10000一下的資料。鍊錶中的遍歷比較複雜,同樣會導致效率低下,以後再做順序表與鍊錶的結合。

模擬實現:

[php]view plain

copy

class

dhc  

else

}    

echo''

;    

echo

"第".

$menarray

[0]. 

"人被留下"

;    

}    

public

function

drop()  

$this

->drophandkerchief(

$start

, $distance

, $menarray

);    

}  }  

數學推導實現:(20170914)

簡單改變一下問題的描述:有 n 個人,編號是 0 - n-1,從 0 開始數,數到 m 則 m 死,下乙個人繼續從 0 開始數,直到只剩最後乙個人,求這個人最開始的編號。

每死乙個人就重新開始,相當於減小了問題的規模,就是要解 n 個規模的解:n, n-1, n-2, n-3 …… 3, 2, 1。

假如在第二輪(n-1個人的規模)中死的那個人編號是 x(這個編號是第乙個人死後,重新從 0 開始編排的),則可以推導出這個人在第一輪(人數為 n 時)中的編號是:(x + m)%n。

(n-2)中死的人在(n-1)中的編號是:(x + m)%(n-1)

(n-3)中死的人在(n-1)中的編號是:(x + m)%(n-2)

……( 1 )中死的人在( 2 )中的編號是:(x + m)%2, 此時 x = 0;

把上面的過程倒過來,已知規模為 1 時,x = 0;

求規模為 2 時,x2 的值:(x + m) % 2 = x2

求規模為 3 時,x3 的值:(x2 + m) % 3 = x3

……求規模為 n 時 x 的值。

[php]view plain

copy

$n= 100;  

$m= 3;  

$s= 0;  

$x= 0;  

for(

$i=2; 

$i<=

$n; 

$i++)   

echo($x

+ $s

) % 

$n;  

// $s=0,表示從第 0 個開始數,如果不是從 0 開始,則只需要向後推 $s 個即可

約瑟夫問題 也叫丟手帕問題

約瑟夫問題 也叫丟手帕問題 不涉及很多演算法,但卻是乙個很好的邏輯訓練題!也是acm訓練oj上的一道題 我用陣列模擬做了一下 丟手帕問題 約瑟夫問題 include includeint main a i 1 置1 出列 while a i 1 找下乙個開始的位置 i i 1 n 注意死迴圈 beg...

丟手帕問題java實現

package com.xiaowen public class demo4 class child 環形鍊錶 class cyclink 設定鍊錶大小 public void setlen int len 設定從第幾個人開始數數 public void setk int k 開始play publ...

單向環形鍊錶,約瑟夫問題(丟手帕)

public class josepfu 建立乙個環形的單向鍊錶 class circlesinglelinkedlist boy curboy null 輔助指標,幫助構建環形鍊錶 使用for迴圈建立環形鍊錶 for int i 1 i nums i else 遍歷當前的環形鍊錶 public v...