P1996 约瑟夫问题
程序员文章站
2022-06-05 18:03:44
...
此题很简单,可以算是模拟题也可以算是队列题,用队列更加简单,比较喜欢队列
模拟AC代码~
#include <iostream>
#include <cstring>
using namespace std;
#define Max 1001
int main()
{
bool flag[Max];
memset(flag,false, sizeof(flag));
int n,m;
cin>>n>>m;
int num=n;
int begin=0;
int i;
while(num)
{
for(i=1;i<=m;)
{
begin=begin%n+1; //连续数三个
if(!flag[begin]) //如果现在的数数是有效的
{
i++; //数数才有效
}
}
flag[begin]=true;//出局的人标记为true
cout<<begin<<" ";
num--;//出局一人
}
return 0;
}
队列AC代码~
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue<int> t;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
t.push(i);
}
int now=1;
while(!t.empty())
{
if(now==m)
{
cout<<t.front()<<" ";
t.pop();
now=1;
}
else
{
t.push(t.front());
t.pop();
now++;
}
}
return 0;
}