约瑟夫环问题的数组实现

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

   例如:n = 9, k = 1, m = 5

【解答】

   出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。

   以上摘录自百度百科

/// <summary>
/// 约瑟夫环
/// </summary>
/// <param name="n">总数</param>
/// <param name="m">开始位置</param>
/// <param name="k">符合条件的数</param>
/// <returns></returns>
public void Josehp(int n, int m, int k)
{
    //参数判断 是否异常
    int[] array = new int[n];
    for (int i = 0; i < n; i++)
    {
        array[i] = i + 1;
    }
    int count = 0;
    int number = n;
    while (number > 1)
    {
        for (int i = 0; i < n; i++)
        {
            if (m != 1)
            {
                i = m - 1;
                m = 1;
            }
            if (array[i] == 0)
                continue;
            count++;
            if (count == k)
            {
                array[i] = 0;
                count = 0;
                number--;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (array[i] != 0)
        {
            Console.WriteLine("the result is:{0}", array[i]);
        }
    }
}

posted @ 2011-03-25 17:25  李传涛  阅读(4650)  评论(0编辑  收藏  举报