算法题,c++,动态规划,基于stl容器vector进行约瑟夫环的实现和复用
一、审题:
约瑟夫环,一共m个人围成一圈,从第一个开始数1,数到n的出圈,输出剩余n-1个人的原有编号。
例子:
50个人围一圈,从第一个开始数1,数到3的出圈,输出剩余2个人的原有编号。
二、代码结构:
1、使用类封装约瑟夫游戏,对外只暴露Game函数,用于调用约瑟夫游戏。
2、维护容器vector和约瑟夫3个功能函数,1个逻辑函数,这些组合在一起作为约瑟夫游戏的完整系统。
三、功能函数和逻辑函数组成的完整系统
1、组合成环
这个函数用于提供一个数量适合的约瑟夫环,并且保证每次提供的约瑟夫环时全新的,去除了“上一次游戏痕迹”的环,这要求对容器的内容做好处理。
void JohnslefCircle::GetCirclre(const int& num)
{
if (num > 0)
{
//有内容
if (m_VecData.size() != 0)
{
//去除内容
m_VecData.clear();
//去除容量
vector<int>(m_VecData).swap(m_VecData);
}
//申请容量
m_VecData.reserve(num);
//初始化每一个位置的值
for (int i = 0; i < num; ++i)
{
m_VecData.push_back(i + 1);
}
}
}
2、筛选出圈
//开始游戏,每out-1个人去掉一个人
void JohnslefCircle::Out(const int& out)
{
if (m_VecData.size() < out)
{
return;
}
int aLive = m_VecData.size();
int count = 0;
vector<int>::iterator itData = m_VecData.begin();
while (aLi