您的位置:首页 > 其它

[华为机试练习题]25.圆桌游戏

2016-01-15 18:58 405 查看
题目

描写叙述:  具体描写叙述:

N个人围坐在一个圆桌上,顺时针报数,报数的初始值为第一个人设置。当有成员报出的数字为7的倍数或数字中包括7,则该人退出圆桌,而后由下一个人開始又一次继续该游戏。

实现下面接口:

1、设定输入原始的圆桌游戏的人数。

以最先開始报数的人编号为1,顺时针排序。

2、设定第一个人的初始值。获取依照规则退出圆桌的人的编号。

3、结束游戏。

例子:

比方初始化为4人的游戏:第1轮初始值为1。退出为3;第2轮初始值为4。退出为4号。第三轮初始值为16。退出为2号;第四轮初始值为6。退出为1号。

练习阶段:  中级


代码

/*---------------------------------------
*   日期:2015-06-31
*   作者:SJF0115
*   题目:圆桌游戏
*   来源:华为机试练习题
-----------------------------------------*/
#include <iostream>
#include <list>
#include "oj.h"
using namespace std;

// 玩家数目
int playerNum = 0;
// 圆桌
list<int> circle;
// 開始玩家
list<int>::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<int>::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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: