約瑟夫環問題求解

2021-07-05 02:19:51 字數 901 閱讀 2157

約瑟夫問題如下:
n個人圍成圈,依次編號為1,2,..,n,現在從1號開始依次報數,當報到m時,報m的人退出,下乙個人重新從1報起,迴圈下去,問最後剩下那個人的編號是多少?

input:

amount 佇列人數

m 數到m時退出乙個人

output:

最後乙個退出的人的下標

思路:(用布林陣列做)

我們可以把這amount個人想象成是都是true的布林陣列,然後每次有個人找true的陣列,是的話就往前進,一直進m個然後進行下一次操作,進了m次之後把m次到達的位置置為false. 如此迴圈往復,直到陣列中只剩乙個true為止

我下面的**就是參照上面思路來寫的。

#include 

using

namespace

std;

bool trek[1000];

void main()

int num=amount;

while(num!=1)

count++; //count位置很講究,不放在這兒就錯了

if(count>amount) count-=amount;//迴圈

if(trek[count]==true) temp++;

}num--;

}for(i=1;i<=amount;i++)

int num=amount;

while(num!=1)

count++;

if(count>amount) count-=amount;

if(trek[count]==true) temp++;

}num--;

}for(i=1;i<=amount;i++)

}

約瑟夫環問題求解

josephu 問題為 設編號為 1,2,n 的 n 個人圍坐一圈,約定編號為 k 1 k n 的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此 產生乙個出隊編號的序列。提示 用乙個不帶頭結點的迴圈鍊錶來處理 j...

約瑟夫環求解O n

有n個人,編號從0到n 1,圍成圈,從0開始報數,第m個人出列,然後繼續從第m 1個人不斷報數 出列,求最後剩下的人是哪個。鍊錶模擬,時間複雜度為o nm 比較簡單,就不贅述了。考慮n個人0,1,2,3,n 1,從0開始報數到m,所以編號為m 1的人出列。剩下m,m 1,m 2,n 2,n 1,0,...

約瑟夫環遞迴求解

約瑟夫環是乙個數學的應用問題 已知m個人 以編號1,2,3.m分別表示 圍坐在一張圓桌周圍。從編號1開始報數,每次報到k的那個人出列,然後下乙個人再從1開始報數。求解 最後乙個出列的人的編號。使用遞迴 假設有10個人,編號為1 2 3 4 5 6 7 8 9 10,k 3。從1開始報數,則第一次出列...