前几天整理硬盘,扒出来自己大一写的一些代码,现在看来虽然非常烂,但是确实非常容易理解(不堪回首哈哈哈)
以下是在不考虑时间复杂度时候的一种解法,只采用了最简单的数组,便于理解
题目
/*
N个猴子围成一个圈
1、从第一只猴子开始报数,第一只猴子报1
2、每个报2的猴子退出,然后从下一只猴子重新开始报数,
3、要求输出退出的顺序和最后剩下的人
*/
//猴子选大王(约瑟夫环问题)
#include<iostream>
using namespace std;
int count(int sum[], int n)//计算当前环中还有几只猴子
{
int counter = 0;
for(int i = 1; i <= n; i++)
{
if(sum[i] == 1)
{
counter++;
}
}
return counter;
}
int main()
{
int n;
cin >> n;//读入猴子总数
int s=1,sum[n+1];//计数器,计算本轮的猴子个数
for(int i = 1 ;i <= n; i++)//sum数组表示猴子,1表示该猴子还在环中,0表示已被淘汰
{
sum[i] = 1;
}
while(count(sum,n) != 1)//计算环中还有几只猴子
{
for(int j = 1; j <= n; j++)
{
if(sum[j] == 1 && s == 2)//当前猴子为第二只猴子,清零计数器并开始下一轮计数
{
sum[j] = 0;
s = 1;
cout << j <<"号猴子被淘汰了。。。" << endl;
}
else if(sum[j]== 1)
{
s =s+1;
}
}
}
for(int i = 1 ;i <= n; i++)
{
if(sum[i] == 1 )
{
cout << "猴王为:" << i <<"号猴子!!" <<endl;
}
}
return 0;
}