約瑟夫環C++實現很經典的做法

原文地址:http://www.cnblogs.com/hanxi/archive/2012/10/10/2718413.html
/*
**********************循環鏈表解決約瑟夫環問題***********************
 * 問題:約瑟夫環
 * 有編號從1到N的N個人坐成一圈報數,從第K個人開始報數,報到M的人出局,
 * 下一位再從1開始報數,如此持續,直止剩下一位爲止,報告此人的編號X。
 * 輸入N,K,M,求出X。
*********************************************************************
 */

#include <iostream>
using namespace std;

struct MyNode
{
    MyNode(int a_data):m_data(a_data),m_pNext(NULL) {}    
    int    m_data;
    MyNode *m_pNext;
};

class Josephus
{
public:
    Josephus(int a_N, int a_K, int a_M):m_N(a_N),m_K(a_K),m_M(a_M)
    {
        createList();
        outputList();
    }    
protected:
    void createList();
    void outputList();    
private:
    MyNode *m_pHead;//循環鏈表的頭節點
    int    m_N;     //鏈表節點個數
    int    m_K;     //第一個報數人的序號
    int    m_M;     //報數出局的數
};
void Josephus::createList()
{
    MyNode *pre = NULL;
    MyNode *cur = NULL;
    MyNode *p = new MyNode(1);
    m_pHead = p;
    cur = p;
    for (int i=2; i<=m_N; i++)
    {
        p = new MyNode(i);
        pre = cur;
        cur = p;
        pre->m_pNext = cur;
    }
    cur->m_pNext = m_pHead;    
    int n=m_N;
    p = m_pHead;
    while (n--)
    {
        cout << p->m_data << ",";
        p = p->m_pNext;
    }
    cout << endl;
}

void Josephus::outputList()
{
    MyNode *pre = NULL;
    MyNode *cur = m_pHead;
    m_K;
    while (m_K--)            //尋找第K個人(開始報數的人)
    {
        pre = cur;
        cur = cur->m_pNext;
    }
    while (m_N--)            //輸出鏈表中所有的節點值
    {
        int s = m_M-1;
        while (s--)            //尋找間隔M的人
        {
            pre = cur;
            cur = cur->m_pNext;
        }
        MyNode *p = cur;
        cout << p->m_data << ",";
        cur = cur->m_pNext;    //刪除節點的過程
        pre->m_pNext = cur;
        delete p;
        p=NULL;
    }
}

int main()
{
    Josephus josephus(100,5,5);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章