据说著名犹太历史学家 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();
- }
- }
- }
故事完毕!
来源: http://www.bubuko.com/infodetail-3068944.html