题目描述:
n个小孩围坐成一圈,并按顺时针编号为1,2.,.-,n,从编号为p的小孩顺时针依次报数,由1报到m,报到m时,这名小孩从圈中出去:然后下一名小孩再从1报数,报到m时再出去。以此类推,直到所有小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。
输入:
第一个是n,第二个是p,第三个是m (0<m, n< 300)。
最后一行是: 000.
输出:
按出圈的顺序输出编号,编号之间以逗号间隔。
样例输入:
8 3 4
0 0 0
样例输出:
6,2,7,4,3,5,1,8
分析:
这道题是著名约瑟夫问题的变体。当约瑟夫问题的数据规模不大时,可以考虑直接利用循环队列进行模拟进行求解。然而,queue只是普通的队列,是不是说就没办法利用queue,而必须重新写一个循环队列呢?其实可以在把queue 的队首元素弹出队列后,再次将其压入队列尾部,用queue来模拟循环队列的效果。
题解:
#include <iostream>
#include<cstdio>
#include<queue>
using namespace std;
int main()
{
int n,p,m;
while(scanf("%d%d%d",&n,&p,&m))
{
if(n==0&&p==0&&m==0)
break;
queue<int> children;
for(int i=1;i<=n;++i)
children.push(i);
for(int i=1;i<p;++i)
{
children.push(children.front());
children.pop();
}
while(!children.empty())
{
for(int i=1;i<m;++i)
{
children.push(children.front());
children.pop();
}
if(children.size()==1)
printf("%d\n",children.front());
else
printf("%d,",children.front());
children.pop();
}
}
return 0;
}