1.问题简述
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
2.实现思路
(1)建立一个孩子类(相当于数据结构中的结点),在类中定义数据域孩子的编号和左右指针.
(2)建立一个圆桌类,类中定义参与游戏的人数和孩子类数组,并在构造方法中初始化孩子类数组.定义构建双向循环链表的方法Bulid(),
注意在此方法中要单独考虑第一个孩子结点和最后一个孩子节点(即头节点和尾节点).然后定义删除结点的方法Run(),也是游戏运行的方法.
(3)定义main()方法,实现约瑟夫环(开始可以定义人数比较少,方便调试).
3.代码
#include <iostream>
using namespace std;
//1.定义小朋友节点类
class Child
{
public:
int childNo; //当前小孩的编号
Child* leftchild; //记录小孩对象的左邻居
Child* rightchild; //记录小孩对象的右邻居
public:
//构造函数
Child(int num = 0)
{
childNo = num;
leftchild = NULL;
rightchild = NULL;
}
};
//2.定义圆圈游戏类
cla