社区讨论
讲解(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数组中的得到游戏结果情况
CPPint 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 条回复,欢迎继续交流。
正在加载回复...