约瑟夫环问题:
n个人围成一圈,从某个人开始报数,数到m的人出列,接着从出列的下一个人报数,数到m再次出列,如此循环往复,直到所有人出列,顺序输出。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Demo_01
{
class Program
{
private static int[] Joseph(int total,int start,int interval )
{
int k = 0;
int[] Count = new int[total+1 ]; //按出列顺序存储数据
int[] Dock = new int[total+ 1 ]; //按顺序存储原始数据
for (int i = 0; i < total; i++)
{
Dock[i] = i;
}
for (int i = total; i >= 2; i--)
{
start = (start + interval - 1) % i;
if (start == 0)
start = i;
Count[k++] = Dock[start];
for (int j = start + 1; j <= i; j++)
{
Dock[j - 1] = Dock[j];
}
}
Count[k] = Dock[1];
return Count;
}
static void Main(string[] args)
{
int[] demo = Joseph(22, 3, 4);
foreach (int i in demo)
{
Console.WriteLine("----------"+i);
}
Console.ReadLine();
}
}
}
————————————————————————————————
这个问题很经典,思路非常多,这种写法是比较常见的C#数组类型来做
很多人也已经写过这些东西了,我写这个只是记录一下吧(* ^ *)。