前幾天遇到一個約瑟夫環演算法的問題,因為當時時間緊,而且之前也沒接觸過這個演算法,也就沒有太深究。今天有時間想起來這個問題了,就研究了一下,寫了一段代碼,試了一下,結果應該是正確的,記錄一下,以後用的時候也好找。下麵一段摘自百度百科。 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2 ...
前幾天遇到一個約瑟夫環演算法的問題,因為當時時間緊,而且之前也沒接觸過這個演算法,也就沒有太深究。今天有時間想起來這個問題了,就研究了一下,寫了一段代碼,試了一下,結果應該是正確的,記錄一下,以後用的時候也好找。下麵一段摘自百度百科。
約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重覆下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後[1] 結果+1即為原問題的解。
下麵貼一下部分代碼,後面可以下載源碼:
private void DoWork() { //列表的角標,用於操作源數據列表中的數據 int index = this.data.Start - 1; //計數,當計到Selected的值時,出列一個數,然後重新開始計數 int count = 1; while (sourceList.Count > 0) { //更新進度條 this.data.ProgressValue++; if (count % this.data.Selected == 0) { resultList.Add(sourceList[index]); sourceList.Remove(sourceList[index]); this.ShowSourecData(); this.ShowResultData(); count = 1; } else { count++; index++; } //當迴圈完源數據列表中的所有數據時,重頭開始再次迴圈 if (index == sourceList.Count) index = 0; //System.Threading.Thread.Sleep(2); } }