游戏规则为:总共有2 * k个人报数,前面k个是好人,后面k个是坏人,从第一个好人开始报数,报道m的人要死去。然后从死人的下一个活人继续从头开始报数,报道m的人死去,以此类推。当k = 12时,问m为何值时,坏人全部死去之前不会有好人死去。(来自实验吧)
程序如下:
#include <iostream>
using namespace std;
const int P = 24;
int per[24];
void init(){ //游戏参与者初始化
for(int i = 0; i < 24; i++){
per[i] = 1;
}
}
//算法测试检验
void print(){
for(int i = 0; i < 24; i++){
cout << i << "|" << per[i] << " ";
if(i%6 == 0 && i != 0){
cout << endl;
}
}
}
bool getP(int N, int start,int livers){
if(livers < 13){
return true;
}
//该处代码省略
int index = start; //检验下一个人存活的位置
for(int i = 0; i < leave-1;){
//找到一个存活的人就继续寻找下一个
if(per[index] == 1){
i++;
if(index+1 == 24){
index = 0;
}else{
index += 1;
}
}else{
//由于数组范围为24所以,不能越界
if(index+1 == 24){
index = 0;
}else{
index += 1;
}
}
}
//寻找死亡的人
while(true){
if(per[index] == 1){
if(index < 12){ //如果死了一个好人,则不满足规则,返回再来下一个数字
return false;
}
per[index] = 0;
break;
}else{
if((index+1) == 24){
index = 0;
}else{
index += 1;
}
}
}
//确定下一个开始位置
int next;
/该处代码省略...
getP(N, next, livers-1);
}
int main()
{
init();
for(int i = 1; i; i++){
if(getP(i, 0, 24)){
cout << i << "!!" << endl;
print();
break;
}
init();
}
}
以上程序对代码进行了省略,如果真正喜欢算法的同学自己琢磨吧,因为本题设计算法不多,而是算法的优化问题