1018 锤子剪刀布 (20 分)
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。
C
代表“锤子”、
J
代表“剪刀”、
B
代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。
输出格式:
输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
复制
输出样例:
5 3 2
2 3 5
B B
复制
我的思路
首先读取输入个数,然后再一边读入双方的出拳一边计算输赢,自定义输赢函数来判断输赢和平手。然后使用vector来保存出拳情况完成第三行的输出,赢次数最多的出拳。
// 1018 锤子剪刀布 (20 分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//判断输赢
//返回:3:平;2:B赢;1:A赢。
int judgeWin(char A, char B) {
if (A == B)
return 3;
//A是锤子
if (A == 'C') {
//B是剪刀
if (B == 'J')
return 1;
//B是布
else if (B == 'B') {
return 2;
}
}
//A是剪刀
else if (A == 'J') {
//B是布
if (B == 'B')
return 1;
else if (B == 'C')
return 2;
}
else if(A == 'B'){
if (B == 'J')
return 2;
else if (B == 'C')
return 1;
}
return 0;
}
//统计出现最多次数的字符
char Max_appear(vector<char> a) {
int number_c = 0;
int number_b = 0;
int number_j = 0;
for (int i = 0; i < a.size(); i++) {
if (a[i] == 'B')
number_b++;
else if (a[i] == 'C')
number_c++;
else
number_j++;
}
if (number_b >= number_c && number_b >= number_j)
return 'B';
if (number_c >= number_b && number_c >= number_j)
return 'C';
if (number_j >= number_c && number_j >= number_b)
return 'J';
return 0;
}
int main(){
//输入
int number_battle;
char A, B;
cin >> number_battle;
int i = number_battle;
vector<char> a;
vector<char> b;
int a_win = 0;
int b_win = 0;
int equal = 0;
//输入同时记录
while (i) {
cin >> A >> B;
//甲赢
if (judgeWin(A, B) == 1) {
a.push_back(A);
a_win++;
}
else if (judgeWin(A, B) == 2) {
b.push_back(B);
b_win++;
}
else {
equal++;
}
i--;
}
cout << a_win << " " << equal << " " << number_battle - a_win - equal << endl;
cout << b_win << " " << equal << " " << number_battle - b_win - equal<< endl;
cout << Max_appear(a) << " " << Max_appear(b);
}
复制
一次就跑成功了,我觉得唯一要注意的点就是按字母顺序输出那里,先判断B然后C最后J就可以了。不是最优化的代码,看看别人博客的代码。感觉ummmm差不太多。
#include<iostream>
using namespace std;
void AlterCh(char c,char &ch)//判定哪个手势赢
{
if(c=='C')
ch='C';
else if(c=='J')
ch='J';
else
ch='B';
}
int Judge(char ch1,char ch2,char &ch)//判定赢的一家及赢的手势
{
if(ch1==ch2)
return 0;//若平则返回0
if(ch1=='C'&&ch2=='J'||ch1=='J'&&ch2=='B'||ch1=='B'&&ch2=='C')
{//若甲赢则记录手势并返回1
AlterCh(ch1,ch);
return 1;
}
AlterCh(ch2,ch);
return -1;//若乙赢则记录手势并返回-1
}
void Handle(int *a,char ch)//统计胜利及手势赢的次数
{
a[3]++;
if(ch=='C')
a[0]++;
else if(ch=='J')
a[1]++;
else
a[2]++;
}
char Compare(int cntC,int cntJ,int cntB)//比较各赢的手势次数
{
if(cntB>=cntJ&&cntB>=cntC)
return 'B';
else if(cntC>cntB&&cntC>=cntJ)
return 'C';
else
return 'J';
}
int main()
{//a[i]:i=0-2:C,J,B赢的次数, i=3,4:胜,平的次数
int N,A[5]={0},B[5]={0};
char ch1,ch2,ch;
cin>>N;
while(N--)
{
cin>>ch1>>ch2;
if(Judge(ch1,ch2,ch)==1)
Handle(A,ch);
else if(Judge(ch1,ch2,ch)==-1)
Handle(B,ch);
else
{//统计平的次数
A[4]++;
B[4]++;
}
}
cout<<A[3]<<' '<<A[4]<<' '<<B[3]<<endl;
cout<<B[3]<<' '<<B[4]<<' '<<A[3]<<endl;
cout<<Compare(A[0],A[1],A[2])<<' '<<Compare(B[0],B[1],B[2]);
return 0;
}
————————————————
版权声明:本文为CSDN博主「18Temp」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37729102/article/details/81673773
复制