//约瑟夫环问题
#include <iostream>
#include <list>
using namespace std;
int bxy1(unsigned int n,unsigned int m)
{
if(n<1 || m<1)
{
return -1;
}
//初始化约瑟夫环
list<int> integers;
for(unsigned int i = 0; i < n; ++i)
{
integers.push_back(i);
}
list<int>::iterator curInteger = integers.begin();
while(integers.size() > 1)
{
//往后数m个位置。如果到达list末尾,从头接着数。
for(int i=1;i < m; ++i)
{
curInteger++;
if(curInteger == integers.end())
{
curInteger = integers.begin();
}
}
//删掉第m个位置上的元素
//把第m+1个位置上的元素保存起来
list<int>::iterator nextInteger = ++curInteger;
//如果m+1个位置上的元素是end,则从begin开始。
if(nextInteger == integers.end())
{
nextInteger = integers.begin();
}
--curInteger;
integers.erase(curInteger);
curInteger = nextInteger;
}
return (*curInteger);
}
//递推公式。。
int bxy2(int n,unsigned int m)
{
if(n<=0 || m<0)
{
return -1;
}
int lastInteger = 0;
for(int i=2; i<=n; ++i)
{
lastInteger = (lastInteger + m) % i ;
}
return lastInteger;
}
void main()
{
cout << bxy1(3,3)<<endl;
cout << bxy2(3,3)<<endl;
}
【100题】约瑟夫环问题。。
最新推荐文章于 2021-12-05 08:05:43 发布