Josephus环

来源:互联网 发布:单片机各引脚功能 编辑:程序博客网 时间:2024/06/05 01:14
//约瑟夫环问题——Josephus.h#include <iostream>class Josephus{private:    unsigned int m_numberOfPeoples;//人数    unsigned int m_killedNumber;//    class People//内部类    {    public:        unsigned int m_number;//编号        People* m_pNextPeople;        People(unsigned int i):m_number(i),m_pNextPeople(NULL){}    };    People* m_pHeadJosephus;//头指针public:    //构造函数->构造环    Josephus(unsigned int number,unsigned int killedNumber):m_numberOfPeoples(number),        m_killedNumber(killedNumber),m_pHeadJosephus(NULL)    {        //为了避免错误输入 和 保存头指针        if( m_numberOfPeoples < 2 )        {            m_pHeadJosephus = new People(1);            m_pHeadJosephus->m_pNextPeople = m_pHeadJosephus;//循环化        }        else        {            m_pHeadJosephus = new People(1);            People* pTempPeople = m_pHeadJosephus;            unsigned int addPeopleNumber = 2;            while( addPeopleNumber <= m_numberOfPeoples )            {                               pTempPeople->m_pNextPeople = new People(addPeopleNumber);//加入链表中                addPeopleNumber++;                pTempPeople = pTempPeople->m_pNextPeople;            }            pTempPeople->m_pNextPeople = m_pHeadJosephus;//循环化        }    }    //打印环    void printJosephus() const;    void killPeople();    //设置开始数数的人    void StartNumber(unsigned int start);};void Josephus::printJosephus() const{    People* pTempPeople = m_pHeadJosephus;    std::cout << "\t\t";    while(m_pHeadJosephus != pTempPeople->m_pNextPeople)    {        std::cout << pTempPeople->m_number << "->";        pTempPeople = pTempPeople->m_pNextPeople;    }    std::cout << pTempPeople->m_number << std::endl;}void Josephus::killPeople(){    People* pTempPeople = m_pHeadJosephus;    //循环直到只有头结点    while(m_pHeadJosephus != m_pHeadJosephus->m_pNextPeople)    {        printJosephus();        unsigned int increase = 1;        for (; increase < m_killedNumber; increase++)        {            pTempPeople = pTempPeople->m_pNextPeople;//被杀掉的人        }        People* pPeople = pTempPeople->m_pNextPeople;        if (m_pHeadJosephus == pPeople)        {            m_pHeadJosephus = pPeople->m_pNextPeople;        }        std::cout << "kill person " << pTempPeople->m_number << std::endl;        *pTempPeople = *pPeople;//被杀的人下一个代替他的位置        delete pPeople;         }    std::cout<< "Last alive people:\n";    printJosephus();}void Josephus::StartNumber(unsigned int start){    unsigned int startNumber = 1;    People* ptempPeople = m_pHeadJosephus;    while( startNumber != start )    {        ptempPeople = ptempPeople->m_pNextPeople;        startNumber++;    }    m_pHeadJosephus = ptempPeople;//新的头指针}int main(){    Josephus j(10, 2);    j.StartNumber(2);    j.killPeople();    return 0;}

这里写图片描述

原创粉丝点击