描述: 有N个人坐在一圈做游戏,给他们编号为1到N,现从1号人开始传递一份烤肉,传递M次停下,将拿着烤肉的人从圈中退出,圈缩小,将烤肉给退出的人后面的人,然后开始继续传递M次停下,又将拿着烤肉的人从圈中退出,圈缩小,依次类推,直到剩下一个人,那个人就可以品尝烤肉了,作程序,看看最后的获胜者是谁?。
分析:设有N个人,烤肉传递M次时,第M+1个人退出,从1号开始传递烤肉。
本文采用STL解法程序如下:
using namespace std;
int main()
{
cout << "请输入人数N: ";
int n;
cin>>n;
list<int> lst;
for(int i = 1; i <= n; ++i )
lst.push_back(i);
cout << "请输入每次退人时需要的传递次数M: ";
int m;
cin>>m;
list<int>::iterator it = lst.begin();
//int k;
while( lst.size() != 1 )
{
for( int i=0; i<m; ++i)
{
if( it != lst.end() )
++it;
else
it = lst.begin();
}
if( it == lst.end() )
it = lst.begin();
cout << *it << " ";
it=lst.erase(it);
if( lst.size() == 1 )
{
cout<<endl;
cout<<"获胜者为: ";
cout<<lst.front();
cout<<"号"<<endl;
}
}
cout<<endl;
return 0;
}
程序运行情况如下:
请输入人数N: 5
请输入每次退人时需要的传递次数M: 1
2 4 1 5
获胜者为: 3号