本文共 1963 字,大约阅读时间需要 6 分钟。
题目
描述: 详细描述:N个人围坐在一个圆桌上,顺时针报数,报数的初始值为第一个人设置。当有成员报出的数字为7的倍数或数字中包含7,则该人退出圆桌,而后由下一个人开始重新继续该游戏。实现以下接口: 1、设定输入原始的圆桌游戏的人数。以最先开始报数的人编号为1,顺时针排序。 2、设定第一个人的初始值,获取按照规则退出圆桌的人的编号。 3、结束游戏。样例:比如初始化为4人的游戏:第1轮初始值为1,退出为3;第2轮初始值为4,退出为4号;第三轮初始值为16,退出为2号;第四轮初始值为6,退出为1号;练习阶段: 中级
代码
/*---------------------------------------* 日期:2015-06-31* 作者:SJF0115* 题目:圆桌游戏 * 来源:华为机试练习题-----------------------------------------*/#include#include #include "oj.h"using namespace std;// 玩家数目int playerNum = 0;// 圆桌list circle;// 开始玩家list ::iterator current;// 功能:设置玩家的个数// 输入: unsigned int nPlayNum 玩家的个数 0 < nPlayNum < 10000;// 输出:无// 返回:无void SetPlayerNum (unsigned int nPlayNum){ playerNum = nPlayNum; // 初始编号 for(int i = 0;i < playerNum;++i){ circle.push_back(i+1); }//for // 默认开始玩家 current = circle.begin();}// 判断是否被踢出局bool isOut(int num){ // 7的倍数 if(num % 7 == 0){ return true; }//if // 包含7 while(num){ if(num % 10 == 7){ return true; }//if num /= 10; }//while}// 功能:根据nInitialNum的值,获取到根据规则下桌的人的编号// 输入:unsigned int nInitialNum 本轮的初始值 0 < nInitialNum < 10000;// 输出:无// 返回:本轮退出圆桌的人的编号unsigned int GetPlayerOut (unsigned int nInitialNum){ int n = nInitialNum; int index = 0; while(playerNum >= 1){ if(isOut(nInitialNum)){ --playerNum; list ::iterator next = ++current; if(next == circle.end()){ next = circle.begin(); }//if --current; int outNum = *current; circle.erase(current); current = next; return outNum; }//if ++nInitialNum; ++current; if(current == circle.end()){ current = circle.begin(); }//if }//while return 0;}// 功能:游戏结束,释放资源// 输入:无// 输出:无// 返回:无void GameOver(){ circle.clear(); playerNum = 0; current = NULL;}
转载地址:http://sliyl.baihongyu.com/