约瑟夫环问题(队列解法)
先简单说明一下队列(queue)的用法:
特点:先进先出(First in First out)
头文件: #include<queue>
定义一个queue的变量: queue<Type> M
相关函数:
M.empty()
:查看是否为空 ,是的话返回1,不是返回0;
M.size()
:返回现有元素的个数
M.front()
:返回队首元素
M.back()
:返回队尾元素
M.push()
:在队尾放置元素
M.pop()
:清除队首元素
描述
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入
8 1 3 (n=8 k=1 m=3 )
输出
7 (剩下的那个)
样例输入
8 1 3
样例输出
7
源代码
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int yue( int k, int m,int n)
{
queue<int>y; //定义队列y
for (int i = 1; i <= n; i++) //将n个人的编号按顺序存入队列y
{
y.push(i);
}
for (int i = k; i > 1; i--) //将第k个人移到队列最前面,并将原来排在前面的人按顺序放到队尾
{
int j = y.front();
y.pop();
y.push(j);
}
while (y.size() > 1) //删除操作,并在当队列中只剩一人时停止该操作
{
for (int i = 1; i <m; i++) //将队列中第m个人移到队首,并将前面m-1个人按顺序排到队尾
{
int h = y.front();
y.pop();
y.push(h);
}
y.pop(); //删除队首元素
}
return y.front(); //返回队列中的最后剩下的那个人
}
int main()
{
int n1, k1, m1;
cin >> n1 >> k1 >> m1;
cout << yue(k1, m1, n1) << endl;
return 0;
}