//用数组模拟约瑟夫环 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { class Program { /// <summary> /// 返回约瑟夫环出列顺序的数组 /// </summary> /// <param name="total">初始全部人数</param> /// <param name="begin">开始编号</param> /// <param name="dequeue">每多少个出列一个</param> /// <returns></returns> static int[] Josephus(int total, int begin, int dequeue) { int count =0,j;//count要输出的数组的下标 int[] iCounts = new int[total];//结果数组 int[] preCounts = new int[total];//初始数组 for (int i = 0; i < total; i++)//预处理初始数组 { preCounts[i] = i; } for (int i = total-1; i >= 2;i-- ) { begin = (begin + dequeue - 1) % i;//每次应该出列的编号 if (begin == 0) { begin = i; } iCounts[count] = preCounts[begin];//将要出列的编号存入结果数组 count++; for (j = begin+1; j <= i; j++) { preCounts[j - 1] = preCounts[j];//一个人出列后,它后面往前移 } } iCounts[count] = preCounts[1];//最后一个出列的 return iCounts;//返回结果数组 } /// <summary> /// 主函数 /// </summary> /// <param name="args"></param> static void Main(string[] args) { int[] JosArray = Josephus(8,5,2);//共有8个人,从第5个开始,数到2的那个人出列 for (int i = 0; i < JosArray.Length - 1; i++) { Console.Write(JosArray[i] + " ");//输出出列顺序 } Console.ReadLine(); } } }
作者:lingyunjinzhu 发表于2013-2-24 0:37:39 原文链接
阅读:124 评论:0 查看评论