约瑟夫环的故事

据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

故事还原:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 约瑟夫环问题
{

    public class Josephusring
    {
        public static int nums { get; set; } = 41;
        public static int[] people = new int[nums];
        private static int outpeople = 3;
        static void Main(string[] args)
        {

            Console.WriteLine("约瑟夫环问题:\n"+ "据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。");
            Josephusring j = new Josephusring();
            j.InitJosephusRing();
            j.Printf_Ring();
            int left = nums;
            int counter = 0;
            int i = 0;
            while (true)
            {
                if (people[i] > 0)
                {
                    counter++;
                }
                if (counter == outpeople)
                {
                    left--;
                    Console.WriteLine(people[i] + "号出局了!\n\n");
                    Console.WriteLine("\n\n");
                    people[i] = 0;
                    counter = 0;
                }

                if (people[i]!=0)
                {
                    Console.WriteLine("当前总人数" + left + "\t" + "当前报数者:" + (i + 1) + "\n");
                }
                j.Printf_Ring();
                if (left <= 2)
                {
                    break;
                }
                i++;
                if (i == nums)
                {
                    i = 0;
                }
            }
            Console.WriteLine("Gameover!!!");
        }
        public void InitJosephusRing()
        {
            for (int i = 0; i < nums; i++)
            {
                people[i] = i + 1;
            }
        }

        public void Printf_Ring()
        {
            for (int i = 0; i < nums; i++)
            {
                Console.Write("\t[" + people[i] + "]" );
            }
            Console.WriteLine();
        }
    }
}

故事完毕!

猜你喜欢

转载自www.cnblogs.com/fenqinearl/p/10910441.html