数据结构约瑟夫环问题c++实现
题目描述:
一个刚出锅的山芋,在围成一圈的n(以编号1,2,3…n分别表示 )个孩子间传递。大家一起数数,从编号为1的孩子开始报数,每数一次,当前拿着山芋的孩子就把山芋交给紧邻其右的孩子。 一旦数到事先约定的某个数k , 那个人就出列,他的下一个人又从1开始报数,数到数k的那个人就出列。如此反复,最后剩下的那个孩子就是幸运者。
试实现算法josephus(int n, int k),输出孩子们出列的次序
程序输入:n k
程序输出:孩子们出列的次序
例子:
输入8 3
输出:
3->6->1->5->2->8->4->7
#include <iostream>
using namespace std;
void josephus(int n, int k)
{
int a[n];//存储每个人的游戏状态,1为游戏中,2为出局
for(int q=0;q<n;q++)//将所有人的游戏状态初始化为1
{
a[q]=1;
}
int i=1,j=0;//i为当前所报数字,j为报数人在数组a中的位置
int count=0;//记录出局人数
while(count<n)
{
if(i<k)//没报到规定数字
{
if(a[j]!=0)//当前位置的人还未出局
{
j++;
i++;//下一个人报的数字加一
}
else
{
j++;//到下一个人报数字,所报数字不变
}
}
else
{
if(a[j]!=0)
{
a[j]=0;
cout<<j+1;//输出报数人的位置
j++;
count++;
if(count<n)
{
cout<<"->";
}
i=1;
}
else
{
j++;
}
}
j=j%n;//循环
}
}
int main(){
int n,k;
cin>>n>>k;
josephus(n,k);
return 0;
}