约瑟夫环问题

  今天写了写约瑟夫环问题(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 }

  有数字实现的花的时间比较多,而用集合实现的花的时间比较少(基数够大的情况下)

posted @ 2015-11-25 20:27  cy-97  阅读(105)  评论(0编辑  收藏  举报