现在的位置: 首页 > 综合 > 正文

约瑟夫循环(数组模拟环)

2018年04月29日 ⁄ 综合 ⁄ 共 687字 ⁄ 字号 评论关闭

  

/*
    最普通的约瑟夫环的写法,用一个数组来模拟一个环,什么算法都没用,以前又看到过链表版本的,
    队列版本的。。。。但是,最神犇你的还要属于位运算版本的。。虽然那个现在还没有学会,以后
    会认真的学习的。
    
    关键的几个要点:do-while的循环终止条件,出队人数的统计,报数器,一个随时跟着所有人编号的变量
                    bool 类型的数组。

*/

# include<cstdio>
# include<iostream>

using namespace std;

# define MAX 100+10

bool a[MAX];//开一个布尔逻辑类型的数组,用来表示队伍中每个人的状态。false表示在队列中,true表示已经出队

int main(void)
{
    int n,m;cin>>n>>m;
    for ( int i = 1;i <= n;i++ )
        a[i] = false;//一开始将所有人都在这个队列中啊
    int t,f,s;
    t = f = s = 0;//do-while前的初始化
    do
    {
        t++;//从第一个人开始依次报数了~
        if ( t == n+1 )
            t = 1;//用数组来模拟一个环,经常使用的一个技巧
        if ( a[t]==false )
            s++;//如果这个位置还有人在的话,就报数加一
        if ( s==m )
        {//报啊报,终于报到我们要找的那个人了~
            s = 0;//报数器从此清0
            cout<<t<<endl;//输出这个人的编号
            a[t] = true;//这个人就从此滚出了队列
            f++;//出队人数加一
        }

    }while( f!=n );//牛逼的结束条件

    return 0;
}


注释做的很详细了,话说刚山口山结束,写到水题热热身~~~~注释写的很清楚了,看不懂的话手模下,很快就能出结果了,

抱歉!评论已关闭.