P1996 约瑟夫问题
约瑟夫问题
题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
样例 #1
样例输入 #1
10 3
样例输出 #1
3 6 9 2 7 1 8 5 10 4
提示
1 ≤ m, n ≤ 100
分析
其实,此题就是一个模拟题。按照题意去做,用visit记录下已经出队了的人,然后模拟,一个个的加就行了。
还要注意,一开始,加的数要赋值为0。还有visit数组要开始全部赋值为false(早就知道了?我第一遍就忘了……)
提交答案
#include<cstdio>
using namespace std;
int main()
{
int n,m,s=0;scanf("%d%d",&n,&m);//入读
bool visit[200]={0};//visit赋初始值
for(int k=0;k<n;k++){//总共要出队n次
for(int i=0;i<m;i++){if(++s>n)s=1;if(visit[s])i--;}//类似取模,而因为序列是从1开始的,所以不取模,加判断;若visit过,则i--,使其继续循环
printf("%d ",s);visit[s]=true;//输出,记录已出队
}
return 0;
}
标签:输出,出圈,int,样例,visit,约瑟夫,问题,P1996
From: https://www.cnblogs.com/bujidao1128/p/17201911.html