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;}
阅读全文
0 0
- Josephus 环
- Josephus环
- Josephus环
- Josephus环
- Josephus环
- Josephus环
- Josephus约瑟夫环问题
- 约瑟夫环问题(Josephus)
- Josephus环问题
- 约瑟夫环问题 Josephus
- 约瑟夫环 josephus
- josephus环问题
- Josephus Circle 约瑟夫环
- Josephus约瑟夫环问题
- 约瑟夫环问题(Josephus)
- Josephus(约瑟夫环)问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题(Josephus)
- RxJava 和 RxAndroid 三(生命周期控制和内存优化)
- 继上一篇博客之后,对数独解析方式进行了优化更新。
- 125. Valid Palindrome(C语言版本)
- 剑指Offer_面试题13_在O(1)时间删除链表结点
- java基本语法
- Josephus环
- 调用约定
- 关于HIVE优化的四种方法总结
- Redis GEO工具类
- Android NDK开发指南(二)Android.mk文件
- 437. Path Sum III
- LoadingCache在Spark HistoryServer中的运用
- httpclient之header的含义参考
- 计算机视觉之分类器