Josephus环


//约瑟夫环问题——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;
}

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值