遞迴求解約瑟夫環問題
01 2345
34 012
01 23
12 0
10
0
假設每一輪報到3的人死亡,然後從死亡的人後一位開始重新編號,以此類推,會形成上面的表格,最後留下的人的編號在開始的時候可以看到是0;那麼要如何求出最後留下的人的編號呢?
(求同一個人在不同輪數中的編號)
首先,從最後第二輪開始,最後留下的人的編號等於他在上一輪的編號 加上死亡間隔(也就是3,隔3個死一個嘛)再模上上一輪的總人數,寫成表示式就是(1 + 3) % 2, (1 + 3) % 3, (1 + 3) % 4, (0 + 3) % 5, (3 + 3) % 6,這樣求出來最後一個人的初始編號為零,然後加一,那麼最後留下的人就是第一個人。
把上一輪的總人數設為
x為上一輪的編號,用遞迴可以表示為:
int JudgmentDeath(int n, int m, int i)
{
if (i == 1)
{
return (m - 1) % n;
}
else
{
return (JudgmentDeath(n - 1, m, i - 1) + m) % n;
}
}
相關推薦
遞迴求解約瑟夫環問題
01 2345 34 012 01 23 12 0 10 0 假設每一輪報到3的人死亡,然後從死亡的人後一位開始重新編號,以此類推,會形成上面的表格,最後留下的人的編號在開始的時候可以看到是0;那麼要如何求出最後留下的人的編號呢? (求同一個人在不同輪數中的編號) 首先,從
佇列法求解約瑟夫環問題
#include<bits/stdc++.h> using namespace std; int main() { int n,p; cin>>n>>p; queue<int> qu; for(int i=1;i<
使用順序表求解約瑟夫環問題 (自定義順序表)
約瑟夫環(Josephus)問題:古代某法官要判決n個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第s個人開始數起,每數到第d個犯人,就拉出來處決,然後再數d個,數到的人再處決……直到剩下的最後一個可赦免。當n=5,s=1,d=2,時: 第一步:定義一個順序表Se
使用順序表求解約瑟夫環問題
//distance 想要第幾個出局.就傳入引數為幾 private static void josephus(int[] array,int distance){ ArrayList
約瑟夫環問題的兩種解決方式(遞迴求解和陣列模擬求解)
約瑟夫環問題各位Acmer肯定都遇到過,就是給你編號為從0~n-1的n個人,從頭開始報數,報到m的人離場,問最後留下的人是幾號。有兩種方法解決這個問題 第一種:陣列模擬 這種方法沒什麼好說的,就是模擬報數和離場的過程,加個訪問陣列標記一下誰離場了就好了 package H
約瑟夫環問題的遞迴實現
約瑟夫環問題有很多實現方法,迭代啦,遞迴啦。 這裡主要介紹一下遞迴的方法。 假設: 初始情況: 0, 1, 2 ......n-2, n-1 (共n個人) 第一個人(編號一定是(m-1)%n,設之為(k-1) ) 出列之後, 剩下的n-1個人組成了一個新的約瑟夫環(以編號為k==m%n的
約瑟夫環遞迴思想
轉自:開啟連結 題目描述:30個遊客同乘一條船,因為嚴重超載, 加上風浪大作,危險萬分。因此船長告訴乘客,只有將全船 一半的旅客投入海中,其餘人才能倖免於難。無奈,大家只 得同意這種辦法,並議定30 個人圍成一圈,由第一個人數起,依次報數,數到第9人,便把他投入大海中,然後
約瑟夫環之二(用遞迴的思想解決Josephus問題)【轉】
初始情況: 0, 1, 2 ......n-2, n-1 (共n個人) 第一個人(編號一定是(m-1)%n,設之為(k-1) ,讀者可以分m<n和m>=n的情況分別試下,就可以得出結論) 出列之後, 剩下的n-1個人組成了一個新的約瑟夫環(以編
javaSE (三十四)File類和遞迴練習(統計資料夾大小、拷貝資料夾、層級列印資料夾、斐波拉契數列、獲取1000階乘全部0和尾部0數目、約瑟夫環)
1、統計資料夾大小: 思路: 套用之前已經做過的,鍵入一個路徑,若有效則封裝成File類 初始化計數器len, 若資料夾下是檔案,則記錄檔案.length() 若資料夾下是資料夾,遞迴 輸出len 注:遞迴也可以刪除資料夾,但是一定要先刪除裡
兩個經典遞迴問題:算瓶蓋與約瑟夫環
但凡遞迴,大部分都是兩句話能搞定的,先確定遞迴停止條件,向外翻轉,再確定迴圈條件,向內遞進 if(xx) return xx; return def(xx...); 首先是算瓶蓋,一百元買啤酒,五元一瓶,三個換一瓶,兩個瓶身換一瓶,求最後總數: 首先,確定條件:
約瑟夫環迴圈連結串列的遞迴實現
約瑟夫(Joseph)問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新
約瑟夫環之二(用遞迴的思想解決Josephus問題)
初始情況: 0, 1, 2 ......n-2, n-1 (共n個人) 第一個人(編號一定是(m-1)%n,設之為(k-1) ,讀者可以分m<n和m>=n的情況分別試下,就可以得出結論) 出列之後, 剩下的n-1個人組成了一個新的約瑟夫環(以編號為k==m
約瑟夫環問題--遞迴推導
本文為學習《劍指offer》的記錄。因其原理在原作者部落格上找不到,所以,只能自己編寫記錄,如有不當之處,歡迎指正。 題目描述: n個數,編號為 0 , 1, ……, n-1 排成一個圓圈,從數字 0 開始,每次從這個圓圈中刪除第 m 個數,請問最後一個剩下
51nod 1073約瑟夫環 遞歸公式法
tar con for names 問題 print 第一個 描述 span 約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈
關於約瑟夫環的幾種求解問題
問題描述:0,1,2......,n-1這n個數字排成一個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡最後剩下的數字。 例如:0,1,2,3,4這5個數字組成一個圓圈,從數字0開始每次刪除第三個數字,則刪除的前四個數字依次是2,0,4,1,因此最後剩下的數字是3. 解法
51Nod1073 約瑟夫環 (遞推公式)
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #
約瑟夫環問題求解--程式+詳細註解
約瑟夫環問題起源於一個猶太故事。約瑟夫環問題的大意如下 羅馬人攻佔了橋塔帕特,41個人藏在一個山洞中躲過了這場浩劫。這41個人中,包括歷史學家約瑟夫和他的一個朋友。剩餘的39個人為了表示不向羅馬人屈服
[CSP]201712-2 遊戲 暴力+(以此為例)約瑟夫環的遞推
愚蠢的看錯題了。中文讀題能力還不如英文,有待提升。 所以這道題用普通的陣列模擬操作就可以了。總之跟暴力模擬的約瑟夫環沒什麼區別。 可以用next陣列模擬指標做資料結構,但是資料範圍不大的情況下不建議這麼寫,維護一個指標環寫起來還是比較麻煩的。 #include <
約瑟夫環數學遞推公式及其證明
對於約瑟夫問題,今天看到了一篇好帖子,是用數學方法處理的,感覺還不錯的 無論是用連結串列實現還是用陣列實現都有一個共同點:要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜 度高達O(nm),當n,m非常大(例如上百萬,上千萬)的時候,幾乎是沒有辦法在短時間內出結果的
Joseph POJ - 1012 約瑟夫環遞推
題意:約瑟夫環 初始前k個人後k個人 問m等於多少的時候 後k個先出去 題解:因為前k個位置是不動的,所以只要考慮每次遞推後的位置在不在前面k個就行 有遞推式 ans[i]=(ans[i-1]+m-1)%(n-i-1) 其中i是輪數 ans[i]