入门者 pat basic 练习十八 锤子剪刀布

无人久伴 提交于 2020-01-27 18:02:43

题目:

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

FigCJB.jpg

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 1 行给出正整数 N(≤10​5​​),即双方交锋的次数。随后 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;
}

心得:

 优先得到某项,可以在一轮比较中最后比较它并获得其值(这样会把前面得到的值给冲刷掉),也可以在函数返回中先返回它

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!