游戏规则:参加丢手绢的人围成一个圈,从任意一个人开始(游戏中可以随意指定,但是算法中默认发起者为1),第一个人开始报数,随后按照规定时针方向开始进行,下一个继续报数(报数规则为:从1开始递增报数),如果参与者报数的大小为3的倍数则退出游戏,其他人继续游戏直至最后一个人。(游戏的娱乐性的体现在于随机的发起者和按照哪个数的倍数执行游戏,只要确定,算法就已经注定了赢家,获胜者只需慢慢等候(期待游戏可以正常进行,如果出现了bug,游戏的乐趣兴许又多了(改变游戏的固定规则,也是一种创新))。
实现代码如下(假设是15个人参加了游戏,报数者为3的倍数即刻出局):
/*
算法核心分析:
每当一个人报数后,并且他不退出时,他下次报出的数目等于他当前报出的数目加上还在进行游戏的人数.
*/
#include <iostream>
using std::endl;
using std::cout;
int* gamers;
//展示每一轮开始之前的存活者和出局者,o代表存活者,x代表出局者
void ShowLiveGamers(int* &arr, int len){
for(int i = 0; i < len; i++){
if(arr[i] != 0){
cout<<(i+1)<<":o ";
}
else{
cout<<(i+1)<<":x ";
}
}
cout<<endl;
}
//寻找到获胜者的编号
int Winner(int* &arr, int len){
for(int i = 0; i < len; i++){
if(arr[i] != 0){
return i;
}
}
}
//对玩家进行编号和为第一轮各个玩家各自报数的大小赋初值
void init(int* &arr, int len){
for(int i = 0; i < len; i++){
arr[i] = 1+i;
}
}
int main(){
gamers = new int[15]; //为gamer动态分配元素个数为15的一维数组
init(gamers, 15); //初始化gamer
for(int i = 15; i > 1; ){ //i就表示当前存在的人数. 当i == 1时即使得出结果,程序结束
ShowLiveGamers(gamers, 15);
for(int j = 0; j < 15; j++){
if(gamers[j] != 0){
if(gamers[j]%3 == 0){
gamers[j] = 0; //认定为出局
i--; //改名游戏者出局,游戏人数 -1
}
else{
gamers[j] += i; //该名游戏者,下一次报数的大小为 其当前报数大小+当前游戏存活人数
}
}
}
}
ShowLiveGamers(gamers, 15);
int TheLast = Winner(gamers, 15);
cout<<"游戏的获胜者的编号是: "<<TheLast+1<<endl;
delete[] gamers;
}
以上就是该算法的具体的实现和详细说明了//