时间限制1.00s 内存限制125.00MB 难易度:普及−
【题目描述】
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
【输入格式】
输入两个整数 n,m。
【输出格式】
输出一行 n 个整数,按顺序输出每个出圈人的编号。
【输入输出样例】
输入 #1
10 3
输出 #1
3 6 9 2 7 1 8 5 10 4
【说明/提示】
1≤m,n≤100
【算法分析】
- 由于对于每个人只有出圈和没出圈两种状态,因此可以用布尔型标志数组存储游戏过程中每个人的状态。true表示出圈,false表示没有出圈。
- 开始的时候,给标志数组赋初值为false,即全都在圈内。
- 模拟报数游戏的过程,直到所有的人出圈为止。
【参考代码】
代码1:
#include <bits/stdc++.h>
using namespace std;
bool a[101];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
a[i]=false; //给标志数组赋初值为false,即全都在圈内。
int f=0,t=0,s=0;
do
{
t++; //逐个枚举圈中的所有位置。
if(t==n+1) t=1; //数组模拟环状,首尾相连。
if(a[t]==false)s++; //第t个位置上有人则报数。
if(s==m) //如果当前报的数是m。
{
s=0; //计数器清零。
cout<<t<<" "; //输出出圈人的编号。
a[t]=true; //此处的人已出圈,设置为空。
f++; //出圈人数加一。
}
}while(f!=n); //直到所有人都出圈为止。
return 0;
}
代码2:(老师写的,更加简便)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,s=0;
cin>>n>>m;
bool visit[200]={0};
for(int k=0;k<n;k++) //总共要出队n次。
{
for(int i=0;i<m;i++) //类似取模,而因为序列是从1开始的,所以不取模。
{
if(++s>n)s=1;
if(visit[s])i--;
}
cout<<s<<" ";
visit[s]=true; //记录已出队。
}
return 0;
}