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

来源:互联网 发布:astropad for mac 编辑:程序博客网 时间:2024/06/06 08:29
  
/*    最普通的约瑟夫环的写法,用一个数组来模拟一个环,什么算法都没用,以前又看到过链表版本的,    队列版本的。。。。但是,最神犇你的还要属于位运算版本的。。虽然那个现在还没有学会,以后    会认真的学习的。        关键的几个要点:do-while的循环终止条件,出队人数的统计,报数器,一个随时跟着所有人编号的变量                    bool 类型的数组。*/# include<cstdio># include<iostream>using namespace std;# define MAX 100+10bool 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;}
注释做的很详细了,话说刚山口山结束,写到水题热热身~~~~注释写的很清楚了,看不懂的话手模下,很快就能出结果了,

0 0
原创粉丝点击