PAT---B1018 锤子剪刀布

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

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

输入格式:

输入第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

解题思路:C代表锤子,J代表剪刀,B代表布,此处为三角恋并两两相克,题目要求按照字典序最小,则可令B为0,C为1,J为2。 此处分析,若甲赢,则甲是0(布),乙是1(锤子);或甲是1(锤子),乙是2(剪刀);或甲是2,乙是0。所以可用(甲+1)%3==乙这个方程式来判断甲赢;当然若将布.锤子和剪刀的值更换成连续的三个正整数,此方程式仍然符合。

参考代码

#include<stdio.h>
#include <iostream>
using namespace std;

int main()
{
    char judge_hand(int a[],int n);                  //函数声明
    void judge_fun(int a[] ,int ,int b[] ,int ,int c[],int );    
                     //函数声明中形参(即括号里的)中int i,i可省略
    int cin_2_figure(char a);
    char C,D;
    int N;              //猜拳次数
    int a[5] = {0};     // a[0]为甲win,a[1]为平,a[2]为甲输,
                        //a[3]为乙win, a[4]为乙输                 
    int b[3] = {0};     //b[0]为甲凭借B赢,b[1]为甲凭借C赢,
                        //b[2]为甲凭借J赢,
    int c[3] = {0};     //c[0]为乙凭借B赢,c[1]为乙凭借C赢,
                        //c[2]为乙凭借J赢,
    cin >> N;
    for(int k = 0;k < N ;k++)
    {
         judge_fun(a,5,b,3,c,3); //此处只是为了将数组传入
                                 //judge_fun()函数,5 3 3无作用
    }
    C = judge_hand(b,3);         //C是b数组中最大的数所对应的出法
    D = judge_hand(c,3);
    cout << a[0] <<" "<< a[1]<< " "<< a[2]<<endl;
    cout << a[3] <<" "<< a[1]<< " "<< a[4]<<endl;
    cout << C << " " << D;

    return 0;
}
char judge_hand(int a[],int n)   //判断形参a数组中最大的数所对应的出法
{
    int comp = 0;                    //comp 为赢得次数最多的那个次数
    for(int i=0;i<n;i++)
    {
        if(a[i]>comp)
            comp = a[i];             //找出a[]数组中较大的数
    }
    if(comp == a[0] )       //如果较大的数是a[0],则说明是布赢得的次数最多,此处先辨别a[0],因为如果有赢得次数相等的出法,则按照字典序输出;即此函数只输出B,C,J中第一个与最大值次数相等的出法,如 2 2 5 则一定输出 5对应的出法;如 2 2 1 则一定输出第一个2 对应的出法;如1 1 1 则一定输出第一个1对应的出法。即符合题意!
        return 'B';
    else if(comp == a[1])
        return 'C';
    else
        return 'J';


}
void judge_fun(int a[],int n,int b[],int m,int c[],int u)    
        //判断赢得次数,n,m,u为形参输入,以将数组传入函数,此处无作用
{
    int cin_2_figure(char a);         //函数声明

    char cin_A,cin_B;
    int q,w;                           
    getchar();                         //cin的如果是char类型,会将换行符也一起输入到输入缓存中,所以这时候用getcahr()函数将换行符消除
    cin >> cin_A>> cin_B;
    q = cin_2_figure(cin_A);      //将cin_A转化为数字比较
    w = cin_2_figure(cin_B);
   if((q+1)%3==w)                 //甲win
       {
           a[0]++;                
           a[4]++;
           if(q == 0)             //甲赢,并且甲出的是0,即布
                b[0]++;
           else if(q == 1)
                b[1]++;
           else
                b[2]++;
       }
    else if(q == w)              //平手
        a[1]++;
    else                          //乙赢
        {
             a[3]++;
             a[2]++;
             if(w == 0)           //乙赢,并且乙出的是0即布
                c[0]++;
             else if(w == 1)
                c[1]++;
             else
                c[2]++;
        }
}

int cin_2_figure(char a)   //将字符B,C,J转化为数字考虑,较为方便
{
    if(a == 'B')
        return 0;
    else if(a == 'C')
        return 1;
    else if (a == 'J')
        return 2;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值