C#: 约瑟夫环 - 解法思路

0.

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,约瑟夫环结束。

1.

用队列,可以很好的模拟这个思路。

    class Program {
        static void Main(string[] args) {
            Console.WriteLine("定义参与的人数: ");
            String peoples = Console.ReadLine();
            Console.WriteLine("定义规定的数字:");
            String numbers = Console.ReadLine();
            int nbs = Convert.ToInt32(numbers);
            Queue pes = new Queue();
            //最先入队的在对头(最先出队),最后入队的在队尾
            for (int i = 1; i <= Convert.ToInt32(peoples); i++) {
                pes.Enqueue(i);
            }
            Console.WriteLine("约瑟夫环开始了");
            int flag = 1;
            while (pes.Count >=  2) { //留下最后一个
                if (flag == nbs) {
                    //报到对应的数字,该人出队,且下个人从1开始报数
                    Console.WriteLine("出队:"+ pes.Dequeue());
                    flag = 1;
                }
                else {
                    pes.Enqueue(pes.Dequeue());
                    flag++;
                }
            }
            Console.WriteLine("约瑟夫环结束,最后出队的是:"+pes.Dequeue());
            Console.ReadKey();

            //另外一种思路
            //给每个人的标志设为0,一开始都是0.然后出队时把标志位设为1.
            //当报数没有出队,则下个0(到尾部时,则从头为0的开始),直到出队时,把0设为1,遇到1则跳过。
            //最终所有的0都会置1,都出队了。
            //

        }
    }

示例打印如下:

定义参与的人数:
10
定义规定的数字:
5
约瑟夫环开始了
出队:5
出队:10
出队:6
出队:2
出队:9
出队:8
出队:1
出队:4
出队:7
约瑟夫环结束,最后出队的是:3

 

你可能感兴趣的:(C#,算法)