2037:【例 5.4】约瑟夫问题
【题目描述】
N 个人围成一圈,从第一个人开始报数,数到 M 的人出圈;再由下一个人开始报
数,数到 M 的人出圈;…输出依次出圈的人的编号。
【输入】
输入 N 和 M。
【输出】
输出一行,依次出圈的人的编号。
【输入样例】
8 5
【输出样例】
5 2 8 7 1 4 6 3
【提示】
【数据范围】
对于所有数据,2≤N,M≤1000
// vector 版本 1:
/*
思路:计算删掉元素的位置 pos=(pos+k-1)%v.size();
然后输出此元素,然后利用 erase 删掉元素。注意:v.size()是动态改变的,删
掉此元素,后面的元素自动往前面移动一个位置。
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<int> v;
int i,n,k;
cin>>n>>k;//scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
v.push_back(i);
}
int pos=0;
int nn=n;
while(nn--)
{
pos=(pos+k-1)%v.size();
cout<<v[pos]<<" ";// printf("%d ",v[pos]);
v.erase(v.begin()+pos);
}
return 0;
}
// 队列版本:
/*
思路:不停出队首元素并计数,若数到 k 的话,输出元素,重新计数,若不数到
k 的话,则队首元素放队尾,重复此操作,直到元素为 0 个。
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
queue<int>qu;
int i,n,k;
cin>>n>>k;//scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
qu.push(i);
}
int cnt=0;
while(qu.size()>0)
{
cnt++;
int x=qu.front();
qu.pop();
if(cnt==k)
{
cout<<x<<" ";
cnt=0;
}
else
{
qu.push(x);
}
}
return 0;
}
约瑟夫问题 信奥一本通2037
本文介绍了如何使用C++编程语言中的vector和队列数据结构来解决约瑟夫问题,即在一定规则下从圈中逐个出圈的人的编号。两种方法分别涉及动态数组操作和队列操作的逻辑实现。
摘要由CSDN通过智能技术生成