約瑟夫環的三種解法

2021-10-01 17:27:17 字數 942 閱讀 8630

約瑟夫問題是個有名的問題:n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。

n個人從1開始編號,問最後活下來的人的編號是多少。

#include

using

namespace std;

intmain()

}printf

("遊戲結束,所有人死亡\n");

return0;

}

主要是利用遞推的思想,令y[ i ]為有i個人時最後活著的人的編號(從0開始編號)。顯然y[ 1 ]=0,現在我們來考慮y[2]為多少。我們已知報到 m-1 的會死.

所有當有兩個人的時候.死的就是那個報m-1的人.然後編號為m的那個人就活了下來.所以y[ 2 ] = y[ 1 ] + m

依次進行遞推:可得y[ i ] = y[ i-1] + m ,由於我們知道報數類似於乙個迴圈.所以編號可能會超出範圍.所以我們對每乙個進行取模。 y[ i ] = ( y [ i- 1] + m) % i ,對 i 取模 保證 編號是從0到 i -1 。

#include

using

namespace std;

intmain()

printf

("最後活著的人的編號為%d\n"

,p+1);

}}

將隊伍看成乙個迴圈佇列.如果沒點到第m個人就放到隊尾,否則彈出,cnt重置.下面上**.

#include

using

namespace std;

intmain()

else

}return0;

}

約瑟夫環的三種解法

有n個程式猿 編號1 n 圍成一圈順序迴圈報數,從第乙個猿開始報數 從1到4報數,猿都是順序排列成一圈的 凡報到4的猿退出圈子,以下乙個為1繼續報數,問最後留下的是原來第幾號的那位。題目的意思大致是這樣,比如最開始有五個人編號為1 2 3 4 5 第二輪起點是5,去掉3 第三輪起點是5,去掉5 第四...

經典演算法 約瑟夫環問題的三種解法

約瑟夫環問題,這是乙個很經典演算法,處理的關鍵是 偽鍊錶 問題描述 n個人圍成一圈,從第乙個人開始報數,報到m的人出圈,剩下的人繼續從1開始報數,報到m的人出圈 如此往復,直到所有人出圈。模擬此過程,輸出出圈的人的序號 在資料結構與演算法書上,這個是用鍊錶解決的。我感覺鍊錶使用起來很麻煩,並且這個用...

詳解基於C 實現約瑟夫環問題的三種解法

目錄 什麼是約瑟夫環問題?約瑟夫環問題在不同平台被 優化 描述的不一樣,例如在牛客劍指offer叫孩子們的遊戲,還有叫殺人遊戲,點名 最直接的感覺還是力扣上劍指offer62的描述 圓圈中最後剩下的數字。問題描述 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字 刪...