前几天遇到一个约瑟夫环算法的问题,因为当时时间紧,而且之前也没接触过这个算法,也就没有太深究。今天有时间想起来这个问题了,就研究了一下,写了一段代码,试了一下,结果应该是正确的,记录一下,以后用的时候也好找。下面一段摘自百度百科。
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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); } }