PATB1018:石头剪刀布
【思路】:
循环–判断条件满足就 记录
记录: 赢 平 输 ;
运用Hash映射求出赢得次数最多的手势 :实质是求出最大值得索引映射
【知识点】
求出一个数组的最大值得索引映射
char ykn[3] = { 'B', 'C', 'J' };
int max0 = 0;
for (int i = 0; i < 3; i++)
{
if (YIN0[max0]<YIN0[i])
{
max0 = i;//最大值得索引
}
}
注意点:输入cin 后面之后还有cin字符串的话需要 用cin.get()来接受 本题没有涉及到,但是用了之后会更加安全 。
for (int i = 0; i < n; i++){
getchar();
cin >> Game[0];
cin.get();
cin >> Game[1];
【参考答案1】
#include <cstdio>
#include <iostream>//cpp
#include <cstring>
#include <string> //Cpp
#include <algorithm>
using namespace std;
//====================================PATB1018=====================
//PATB1018 按照题意进行模拟,锤子剪刀布
void CJB(){
char Game[3] = {};
int yin[2] = { 0 };
int shu[2] = { 0 };
int pin = 0;
int n;
int YIN1[3] = { 0 }; // YIN[0]==B赢 YIN[3]得到数组 B C J分别赢得次数 然后求出最大值的 索引 其实可以考虑写一个changed函数了
int YIN0[3] = { 0 };
scanf("%d", &n);
for (int i = 0; i < n; i++){
getchar();
cin >> Game[0];
cin.get();
cin >> Game[1];
if (Game[0] == Game[1]){
pin++;
}
else{
if (Game[0] == 'B'){
if (Game[1] == 'C'){
yin[0]++;
YIN0[0]++;//B
shu[1]++;
}
else if (Game[1] == 'J'){
shu[0]++;
yin[1]++;
YIN1[2]++;//J
}
}
else if (Game[0] == 'C'){
if (Game[1] == 'B'){
shu[0]++;
yin[1]++;
YIN1[0]++;//B
}
else if (Game[1] == 'J'){
yin[0]++;
YIN0[1]++;//C
shu[1]++;
}
}
else if (Game[0] =='J'){
if (Game[1] == 'C'){
shu[0]++;
yin[1]++;
YIN1[1]++;//B
}
else if (Game[1] == 'B'){
yin[0]++;
YIN0[2]++;//C
shu[1]++;
}
}
}
}
cout<<yin[0] << " "<<pin << " " <<shu[0] << endl;
cout<<yin[1] << " "<<pin << " " <<shu[1] << endl;
//下面需要计算赢得最多的手势 也就是求出一个数组的 最值的索引。 这里需要注意如果是
char ykn[3] = { 'B', 'C', 'J' };
int max0 = 0,max1=0;
for (int i = 0; i < 3; i++)
{
if (YIN0[max0]<YIN0[i])
{
max0 = i;//最大值得索引
}
if (YIN1[max1]<YIN1[i])
{
max1 = i;//最大值得索引
}
}
cout << ykn[max0] <<" " << ykn[max1];
}
int main(){
CJB();
return 0;
}
【参考答案2】
【知识点】
未完 待分析
//====================================PATB1018=====================
//PATB1018 按照题意进行模拟,锤子剪刀布
int change(char c){
if (c == 'B')return 0;
if (c == 'C')return 1;
if (c == 'J')return 2;
}
void BCJ1018(){
int n;
scanf_s("%d", &n);
char c1, c2;//输入字符串
int k1, k2;//转换后的两个选手的号码便于计算
int time_A[3] = { 0 };//记录第一位的输 平 赢
int hands_A[3] = { 0 };//记录出什么 赢 平 输的次数
int hands_B[3] = { 0 };
for (int i = 0; i < n; i++){
getchar();
scanf_s("%c %c", &c1, &c2);
k1 = change(c1);
k2 = change(c2);
if ((k1+1)%3==k2){
time_A[0]++;//甲赢
hands_A[k1]++;//甲靠的是k1赢
}else if (k1==k2){
time_A[1]++;
}
else if ((k2 + 1) % 3 == k1){
time_A[2]++;//甲输
hands_B[k2]++;//乙靠的是k2赢
}
}
printf("%d %d %d\n", time_A[0], time_A[1], time_A[2]);
printf("%d %d %d\n", time_A[2], time_A[1], time_A[0]);
//以上完成的是计算甲乙的胜负次数;下面计算最大值的索引
char ykn[3] = { 'B', 'C', 'J' };
int maxyk1=0, maxsk2=0;
for (int i = 0; i < 3; i++){
if (hands_A[maxyk1] < hands_A[i]){
maxyk1 = i;//为赢得最多的 索引
}
if (hands_B[maxsk2] < hands_B[i]){
maxsk2 = i;
}
}
printf("%c %c", ykn[maxyk1], ykn[maxsk2]);
}