题目:
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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
思路:
定义一个记录输赢的数组record[3],只针对甲的,甲输了record[0]加一,平局了record[1]加一,甲赢了record[2]加一,因为甲赢的局就是乙输的局,所以倒序输出record是甲的记录,正序输出是乙的记录
定义一个函数用于比较输赢,同样也是针对甲的,甲赢返回1,输返回-1,平局返回0
至于输出胜率最大的手势,可以定义两个数组,一个是甲各个手势赢的局,另一个是乙各个手势赢的局,下标012各代表布,锤子,剪刀,其值表示使用这个手势赢的局数,然后选出最大值,可以从剪刀,锤,布这个顺序和最大赢局进行比较,因为如果相同的话选出最小的字母,所以使用">="和最大值比较,即使都相同,而先比较的是字母大的,最后一个符合条件的肯定是字母最小的
也可以定义一个函数,先比较字母小的,如果这个字母较小的赢的局都是>=其他的手势赢的局,那么就先返回它,这样也能得到字母小的手势(具体结合代码才能明白。。。)
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int cmp(string a,string b,int*weapon_a,int*weapon_b)
{
if(a==b)return 0;
if(a=="B"&&b=="C")
{
weapon_a[0]++;
return 1;
}
if(a=="B"&&b=="J")
{
weapon_b[2]++;
return -1;
}
if(a=="C"&&b=="J")
{
weapon_a[1]++;
return 1;
}
if(a=="C"&&b=="B")
{
weapon_b[0]++;
return -1;
}
if(a=="J"&&b=="B")
{
weapon_a[2]++;
return 1;
}
if(a=="J"&&b=="C")
{
weapon_b[1]++;
return -1;
}
}
string best_wea(int*weapon)
{
if(weapon[0]>=weapon[1]&&weapon[0]>=weapon[2])
return "B";
else if(weapon[1]>=weapon[2]&&weapon[1]>=weapon[0])
return "C";
else
return "J";
}
int main()
{
int n,res;
scanf("%d",&n);
string a[n],b[n];
string a_best_wea,b_best_wea;
int record[3]={};//下标0代表输,1代表平,2代表赢,针对a,a输的局就是b赢的局,所以一个数组就够了
int weapon_a[3]={};//a的各个武器赢的局下标0代表布,1代表锤,2代表剪刀
int weapon_b[3]={};//b的各个武器赢的局下标0代表布,1代表锤,2代表剪刀
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
res=cmp(a[i],b[i],weapon_a,weapon_b);
if(res==0)
record[1]++;
else if(res==1)
record[2]++;
else
record[0]++;
}
for(int i=2;i>=0;i--)//输出a的记录
{
cout<<record[i];
if(i!=0)
cout<<" ";
else
cout<<endl;
}
for(int i=0;i<3;i++)//输出b的记录
{
cout<<record[i];
if(i!=2)
cout<<" ";
else
cout<<endl;
}
a_best_wea=best_wea(weapon_a);
b_best_wea=best_wea(weapon_b);
cout<<a_best_wea<<" "<<b_best_wea;
return 0;
}
心得:
优先得到某项,可以在一轮比较中最后比较它并获得其值(这样会把前面得到的值给冲刷掉),也可以在函数返回中先返回它
来源:CSDN
作者:笑笑逍遥生
链接:https://blog.csdn.net/qq_40930559/article/details/104093185