社区讨论

讲解(C++)

P1328[NOIP 2014 提高组] 生活大爆炸版石头剪刀布参与者 11已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mlkwybxy
此快照首次捕获于
2026/02/13 21:18
6 天前
此快照最后确认于
2026/02/13 21:27
6 天前
查看原帖
1.分析 将游戏所有可能的结果(小A对小B)用数组存储起来(game[5][5]),第一个下标表示A出拳的情况,第二个下标表示B出拳的情况,数组存储的是出拳后的结果:1表示A赢,B输;−1表示A输,B赢;0表示平局;
读入猜拳次数N,A的猜拳周期N_A,B猜拳周期N_B;
循环N次,模拟游戏过程:
i用来遍历A的猜拳周期,j遍历B的猜拳周期;
当i≥N_A,则遍历完一次周期,进入下一个周期,重置(i=0);j同理,当j≥N_B,j=0;
circle_A[i]是此时A的出拳情况,circle_B[j]是此时B的出拳情况,带入game数组中的得到游戏结果情况
CPP
int result=game[circle_A[i]][circle_B[j]];
若结果是1表示A赢,B输,A得1分(score_A++);−1表示A输,B赢,B得1分(score_B++);0表示平局,都不得分; i,j向后移动(i++,j++)。
输出A,B的得分情况(score_A,score_B)。 2.代码
CPP
#include <iostream>
using namespace std;
int N;                  //猜拳次数
int N_A;                //A的猜拳周期长度
int N_B;                //B的猜拳周期长度
int circle_A[205];      //A的猜拳周期
int circle_B[205];      //B的猜拳周期
int score_A = 0;		//A的得分
int score_B = 0;		//B的得分
int game[5][5] =        //游戏的结果情况,1表示A赢,-1表示A输,0表示平
{
	{0, -1, 1, 1, -1},
	{1, 0, -1, 1, -1},
	{-1, 1, 0, -1, 1},
	{-1, -1, 1, 0, 1},
	{1, 1, -1, -1, 0}
};
int main(void)
{
	cin >> N >> N_A >> N_B;
	for(int i = 0; i < N_A; i++)
	{
		cin >> circle_A[i];
	}
	for(int i = 0; i < N_B; i++)
	{
		cin >> circle_B[i];
	}
	int i = 0;          //遍历A的猜拳周期
	int j = 0;          //遍历B的猜拳周期
	while(N--)
	{
		if(i >= N_A)
		{
    i = 0;
		}
		if(j >= N_B)
		{
            j = 0;
		}
		//比较结果
		int result = game[circle_A[i]][circle_B[j]];
		if(result == 1)
		{
			score_A++;
		}
		else if(result == -1)
		{
			score_B++;
		}
		i++;
		j++;
	}
	cout << score_A << " " << score_B;
	return 0;
}

回复

17 条回复,欢迎继续交流。

正在加载回复...