约瑟夫环问题
今天写了写约瑟夫环问题(n个人围成一圈,选一个位置,并从这个位置开始,每隔m-1个人,第m个人出列,在从下一个位置重复执行,直到所有人出列)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 //12个人围成一圈,从第三个人开始,数到4就剔除 7 namespace 约瑟夫环 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Jose(12, 3, 4);//数组解决 14 Console.WriteLine(); 15 LJose(12 , 3, 4);//集合解决 16 Console.ReadKey(); 17 } 18 public static void Jose(int total,int start,int alter) 19 { 20 int j, k = 0; 21 int[] result = new int[total+1]; 22 int[] a = new int[total+1]; 23 for(int i=0;i< total; i++) 24 { 25 a[i] = i+1;//第一个人为第一号 26 } 27 for(int i= total; i >0; i--) 28 { 29 start = (start + alter-2) % i;//由于数组开始是0开始,所以要多减一个1 30 //if (start == 0) 31 // start = i; 32 result[k] = a[start]; 33 k++; 34 for( j=start+1;j<= i; j++)//把剔除的人的位置覆盖 35 { 36 a[j - 1] = a[j]; 37 } 38 start++;//下一个人 39 } 40 //result[k]=a[1]; 41 foreach (var item in result) 42 { 43 Console.Write(" "+item); 44 } 45 }/// <summary> 46 /// 约瑟夫环问题 47 /// </summary> 48 /// <param name="总的人数"></param> 49 /// <param name="开始位置"></param> 50 /// <param name="第几个人出列"></param> 51 public static void LJose(int total,int start,int alter)//用集合解决更简单 52 { 53 List<int> a = new List<int>(); 54 List<int> result = new List<int>(); 55 for(int i = 0; i < total; i++) 56 { 57 a.Add(i+1); 58 } 59 for(int i= total; i >0; i--) 60 { 61 start = (start + alter-2) % i;//找到集合中被移除的人的位置 62 //if (start == 0) 63 // start = i - 1; 64 result.Add(a[start]);// 65 a.RemoveAt(start);//移除这号人 66 start++; 67 68 } 69 70 foreach (var item in result) 71 { 72 Console.Write(" "+item); 73 } 74 } 75 } 76 }
有数字实现的花的时间比较多,而用集合实现的花的时间比较少(基数够大的情况下)