约瑟夫(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
;
}