【luoguP1996】【luogu-original】约瑟夫问题

先来看题目:

              P1996 约瑟夫问题

题目背景

约瑟夫是一个无聊的人!!!

题目描述

n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.

输入输出格式

输入格式:n m
输出格式:出圈的编号

输入输出样例

输入样例:
10 3
输出样例:
3 6 9 2 7 1 8 5 10 4

说明

m<=100,n<=100

说实话,这个题就是一个非常水的模拟题,首先我们可以不按照题目来说的一个一个的去人,我们将已经出队的人做一个标记,再次循环的时候不经过他就可以了。我们bool一个visit用来标记已经出了队的人,防止重复统计,然后两个循环解决问题。

下面附上代码:

#include<cstdio>
using namespace std;
int main()
{
    int n,m,s=0;scanf("%d%d",&n,&m);//读入
    bool visit[200]={0};//visit赋初始值全为0
    for(int k=0;k<n;k++)总共要出队n次所以循环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;//输出,将已经出队的人标记为1防止重复
    }
    return 0;
}    
原文地址:https://www.cnblogs.com/sue_shallow/p/luoguP1996.html