一群小孩 围成一圈,任意假定一个数m,从第一个小孩起,按顺时针方向数,每数到第m个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。
今天这章我为大家讲解一下约瑟夫环的问题,上面就是这道题的例子。狗头!
直接上代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main() {
//n个小孩围成圆圈
const int numofBoy = 30; //小孩总数
int boy[numofBoy]; //小孩数组
int i;
for (int i = 0; i < numofBoy; i++) {//从1开始给小孩编号
boy[i] = i + 1;
}
//输入小孩的间隔
int m;
cout << " please input the interval: ";//间隔
cin >> m;
//输出开始时的小孩编号
for (i = 0; i < numofBoy; i++) {
cout << boy[i] << ",";
}
cout << endl;
//小孩依次离开
i = 0; //当前位置设置为第1个小孩
int n = numofBoy; //离开小孩的个数
while (n > 1) { //只剩一个小孩
//数到第m个小孩离开
int j = m;
do
{
//当前位置i调整到下一个小孩
i = (i + 1) % numofBoy;
while (boy[i] == 0) {
i = (i + 1) % numofBoy;
}
j--; //输一个小孩
} while (j > 1); //数到第m个小孩
//第m个小孩离开
cout << boy[i] << ","; //输出离开的小孩编号
boy[i] = 0; //标识该小孩离开
//当前位置i调整到下一个小孩
i = (i + 1) % numofBoy;
while (boy[i] == 0) {
i = (i + 1) % numofBoy;
}
n--; //离开一个小孩
}
//宣布得胜者
for (int i = 0; i < numofBoy; i++) {
if (boy[i] != 0) {
cout << "\n\nNo." << boy[i] << " 获胜.\n"; //输出获胜者
break;
}
}
return 0;
}
分析一下这个代码,这个代码适合初学者,但是C++小白就不要妄想了,请你们学习好基础再来学习这个问题。
这个代码并没有利用什么高级算法,只是简单的利用了最基础的数据结构---数组,来解决的,适合于C++新手来锻炼思维,在下一章,我会为大家讲解用vector来解决这件事。
Power!!!