約瑟夫問題如下:
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開始報數,則第一次出列...