约瑟夫环问题

来源:互联网 发布:在线二次元av淘宝 编辑:程序博客网 时间:2024/06/05 01:18

假设又m个人围成一圈,从第n个人开始报数m个,报到m的人出圈,输出每个人的出圈顺序。

class Program    {        static void Main(string[] args)        {            Program p = new Program();            p.Print(9,2,5);        }        //allNum 总人数 startNum 开始数的位置 num 步长          public void Print(int allNum,int startNum,int num)        {            int temp = 0;            //声明一个存放跳出来的人的数组            int[] outPut = new int[allNum];            //声明一个数组存放出圈的人以打印出圈顺序            int[] arr = new int[allNum + 1];            //添加人allNum个            for (int i = 1; i <= allNum; i++)            {                arr[i] = i;            }            //遍历找到出圈的人,并将其放到数组的后边            for (int i = allNum; i > 1; i--)            {                startNum = (startNum + num - 1) % i;                if (startNum == 0)                    startNum = allNum;                outPut[temp] = arr[startNum];                temp++;                for (int j = startNum; j < i; j++)                {                    arr[j] = arr[j + 1];                }                outPut[temp] = arr[1];            }            for (int i = 0; i < allNum; i++)            {                Console.WriteLine("我是第" + outPut[i] + "个人,我是第" + (i + 1) + "个出圈的");            }        }    }
主要逻辑在于找到出圈的人以及对出圈的人在原数组中的处理。

由于数组不能像List一样随意删除里面的元素,所以将已经出圈的人放到数组的后边,并且下次遍历时数组的长度减1。

outPut[temp] = arr[1];

数组中的第一个人必然是最后一个出圈的,当外层for循环完成时,将最后一个人添加进outPut数组中。

输出结果:


Tip:如果要删除数组中的元素的话,可以将其转换为List,删除元素后在转换成数组

 int[] arry = new int[3] { 1,2,3}; ArrayList al = new ArrayList(arr); al.RemoveAt(1); arr = (int[])al.ToArray(typeof(int)); Debug.Log(arr.Length);

原创粉丝点击