约瑟夫(josephus)环算法实现

    约瑟夫(josephus)环是这样的:假设有n个小孩坐成一个环,假如从第一个小孩开始数,如果数到m个小孩,则该小该离开,问最后留下的小孩是第几个小孩?例如:总共有6个小孩,围成一圈,从第一个小孩开始,每次数2个小孩,则游戏情况如下:
    小孩序号:1,2,3,4,5,6
    离开小孩序号:2,4,6,3,1
最后获胜小孩序号:5

代码:

 

//
 josephus.cpp : 定义控制台应用程序的入口点。

//


#include 


stdafx.h


#include 


iostream


using
 
namespace
 std;

int
 _tmain(
int
 argc, _TCHAR
*
 argv[])
{
    

int
 peopleNumber;
    cout

<<

输入环中的人数:

;
    cin 

>>
peopleNumber;
    

int
*
 people 
=
 
new
 
int
[peopleNumber];
    

int
*
 people_flag 
=
 
new
 
int
[peopleNumber];

    cout
<<

初始化……

<<
endl;
    

for
(
int
 i 
=
 
0
 ; i 
<
 peopleNumber ; i
++
)
        {
            people[i] 

=
 i;
            people_flag[i] 

=
 
0
;
        }

    
int
 interval;
    cout

<<

输入淘汰者要读的数字

;
    cin 

>>
 interval;

    
int
 count 
=
 
0
;
    

int
 people_least 
=
 peopleNumber;
    

do

    {
    

for
(
int
 i 
=
 
0
; i 
<
 peopleNumber; i
++
)
        {
            

if
(people_flag[i] 
==
 
0
 
&&
 count 
==
 interval)
                {
                    cout 

<<
 



 
<<
 peopleNumber 

 people_least
+
1
 
<<
 

轮序号是

 
<<
 people[i] 
<<
 

的人被踢出环

 
<<
 endl;
                    people_flag[i] 

=
 
1
;
                    count 

=
 
0
;
                    people_least 


;
                }
            

if
(people_flag[i] 
==
 
0
 
&&
 count 
!=
 interval)
                {
                    count 

++
;
                }
        }
    }

while
(people_least 
!=
 
1
);
    
    

for
(
int
 i 
=
 
0
 ; i 
<
 peopleNumber ; i
++
)
        {
            

if
(people_flag[i] 
==
 
0
)
                cout

<<

现在还剩序号是

<<
people[i]
<<

的人

<<
endl;
        }

    getchar();
    getchar();
    
return
 
0
;
}

 

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/lwm1986/article/details/1710730
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞