【C++】找出游戏最后的胜利者

绿盟科技2022校招研发工程师的一题,考试的时候没做出来,现在来做个记录。有问题的话请指出。

题目描述:
一个游戏,有的的规则如下:
(1)所有参与者围成一个圆圈坐下,编号为1 2 3 4 5…
(2)每个人有一块白板,写一个大于零的整数Nx.
(3)主持人在白板上写下一个大于零的数N1,随后随机指定一人开始游戏
(4)从这个人开始从1报数,数到N1的人将会被淘汰出局
(5)被淘汰的人向所有人展示其白板上写的数字Nx
(6)被淘汰的人下一位开始从1报数,数到Nx的人再次淘汰
(7)直到最后一个人,最后一个人胜利

输入描述:
(1)一组数字,
(2)第一个表示参加的人数N,第二个表示主持人指定的游戏开始的人的序号,第三个表示第一次的Nx,第4到N+4表示每个参与者写在板上的数字。
输出胜利者的序号。

#include<iostream>
#include<vector>

using namespace std;

int game(int N, int begin, int first_password, vector<int> password) {
	//N总人数,begin第一个开始的位置,first_password第一个淘汰的数,password每个人写的淘汰的数。
	begin = begin - 1;						   //后面的下标都从零开始

 	int x = first_password%N;
	int temp = begin + x - 1;                  //余1的时候回到了他自己
	int pass = temp % N;					   //计算第一个被淘汰的人

	int next_password = password[pass];
	password[pass] = -1;					   //被淘汰标记为-1
	
	for (int i = 0; i < N - 1; ++i) {
		//如果有10个人,现在再循环9次,找到最后一个被淘汰的就行了
		temp = 0;				               //因为pass指向上一个被淘汰的人,所以下次报数从0开始,
		while (temp != next_password) {
			++pass;
			if (pass >= N) pass -= N;
			if (password[pass] != -1) ++temp;
		}
		next_password = password[pass];
		//cout << pass << " ";
		password[pass] = -1;					//被淘汰标记为-1	
	}
	return pass + 1;							//返回值的下标从1开始。
}

int main() {
	int N;
	cin >> N;
	int begin;
	cin >> begin;
	int first_password;
	cin >> first_password;
	vector<int> password(N, 0);
	for (int i = 0; i < N; ++i) {
		int temp;
		cin >> temp;
		password[i] = temp;
	}
	
	int winer = game(N, begin, first_password, password);
	cout << winer;
	
	system("pause");
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值