最简单的约瑟夫游戏的求解问题,一看就会
约瑟夫小游戏:游戏规则,共有n个人,并给每一个人编号为1至n,再给定一个m的值。该游戏从编号为1的人开始报数,直到报数到m,则此人出局,然后下一个人,接着从1开始报数,重复以上的规则,求出局人的先后顺序。
我自己刚开始的时候也是没想出来,也看了好多的资料,也看了好多的解法,以下是我认为最简单,最容易理解的算法。
解题思路:1.首先用一个数组array来表示n个人,并都初始化为0,代表这n个人在数组中,还没出局。
2.设定个人的编号为number=0,开始报数的数为 count=0,出局的人数为die=0。
3.如果countm,则代表此人出局,并将此人在数组array中的位置置为1,依次循环,直到dien。
c++代码:
#include<iostream>
using namespace std;
int main()
{
int n=0,m=0;//n为总的人数,m出局的位置
std::cin>>n>>m;
int* array=new int[n];
//初始化数组为0,代表游戏开始前没有人出局
for(int i=0;i<n;i++)
{
array[i]=0;
}
int number=0;
int count=0;
int die_people=0;
while(die_people<n)
{
number++;
//判断number是否大于n
if(number>n)
{
number=1;
}
//表示此人还未出局
if(array[number-1]==0)
{
count++;
if(count==m)
{
count=0;
cout<<"编号为"<<number<<"的人出局了"<<endl;
//出局后将该位置置为1
array[number-1]=1;
die_people++;
}
}
}
delete array;
return 0;
}
运行结果:
转载请标明出处谢谢,本人也是一枚小白,欢迎大家一起交流分享