約瑟夫環問題解決

2021-09-26 07:08:23 字數 1665 閱讀 7844

問題描述:編號為1-n的n個士兵圍坐在一起形成乙個圈,從編號為1的士兵依次開始報數(1,2,3..依次報),數到m的士兵會被殺死出列,之後的士兵再從1開始報數。直到最後剩下一士兵。求這個士兵的編號。

方法一:陣列

第一次做這個題的時候,第一反應就是用陣列來做。建立乙個boolean陣列,用true表示沒出列,false表示出列,定義乙個計數器,遍歷陣列,當加到與m相等時,就將true變為false,計數器變為零,重新計數。

public class test 

int peopleleft = n; //剩下的人數

int count = 0; //計數器,每過乙個人加一,加到m時歸零

int index = 0; //開始下標

while (peopleleft > 1)

}index++;

//當當前人等於總人數時,則又從第一人開始計數

if (index == n)

}for (int j = 0; j < n; j++)

}return null;

}public static void main(string args)

}

方法二:鍊錶

先實現乙個迴圈鍊錶,在把編號新增到鍊錶裡面,也需要乙個計數器,初始值為1,遍歷鍊錶,當計數器的值等於m是,計數器變為1,刪除當下節點。依次直到迴圈結束。

public class test2 

}public static int solve(int n,int m)

node head = createlinkedlist(n);

int count = 1;

node cur = head;

node pre = null;

while(true)

if(count == m)else

}return pre.date;

}public static node createlinkedlist(int n)

//頭尾串聯

next.next = head;

return head;

}public static void main(string args)

}

方法三:遞迴

每次在讓乙個士兵出列後,對剩下的重新編號。

刪除前的編號和刪除後編號對比

m-2                           n-2

m-1                           n-1

m                              已刪除

m+1                          1

m+2                          2

這樣我們就可以得到刪除前的編號與刪除後的編號的關係:刪除前編號 = (刪除後編號+m-1)%n+1,為什麼不是刪除前編號 = (刪除後編號+m)%n,因為編號是從1開始的,拖過刪除後的編號+m = n,那麼刪除前的結果就為0,不符合。

public class test3 

return (f(n-1,m) + m-1) % n +1;

}public static void main(string args)

}

約瑟夫環問題的解決

約瑟夫環問題介紹 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。include include include typedef int datat...

python解決約瑟夫環問題

問題描述 編號為 1 n 的 n 個士兵圍坐在一起形成乙個圓圈,從編號為 1 的士兵開始依次報數 1,2,3 這樣依次報 數到 m 的 士兵會被殺死出列,之後的士兵再從 1 開始報數。直到最後剩下一士兵,求這個士兵的編號。有用遞迴函式 f n,m 的返回結果是存活士兵的編號,推導出old 與 new...

c 解決約瑟夫環問題

c 解決約瑟夫環問題 約瑟夫 josephus 問題 m個人圍坐成一圈,從1開始順序編號 遊戲開始,從第乙個人開始由1到n迴圈報數 報到m的人退出圈外問 最後留下的那個人原來的序號 本題可以定義乙個容器 vector 初始化大小 元素個數 為n。容器裡元素的值標識該人是否出局,1在圈內,0出局。值為...