PAT1018锤子剪刀布

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

输入格式:

输入第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
解题思路:一个函数用来统计胜负,一个用来统计出哪种拳胜率最高。
一,参赛者结构体,包含了胜负平的次数,与获胜时出拳的记录

struct peo{
    int win;
    int draw;
    int lose;
    int whoWin[3];
};

二,判断函数,根据剪刀石头布的规则来判断胜负,并肩负记录“胜拳”的功能

int panDuan(char a, char b,peo &p1,peo &p2){
    if (a == 'C'&&b == 'J'){++p1.whoWin[0] ; return 1; }
    else if (a == 'J'&&b == 'B'){ ++p1.whoWin[1]; return 1; }
    else if (a == 'B'&&b == 'C'){ ++p1.whoWin[2]; return 1; }
    else if (a == b)return 2;
    else if (a == 'J'&&b == 'C'){ ++p2.whoWin[0]; return 3; }
    else if (a == 'B'&&b == 'J'){ ++p2.whoWin[1]; return 3; }
    else if (a == 'C'&&b == 'B'){ ++p2.whoWin[2]; return 3; }
    else return 0;
}

三,输出甲、乙获胜次数最多的手势。如果解不唯一,则输出按字母序最小的解

char winWin(peo p1){
    char Fist[3] = { 'C', 'J', 'B' };
    char WF = 'X';
    int k = 0,L=0;
    int maxdd = -1;
    for (int i = 0; i < 3; ++i){
        if (maxdd < p1.whoWin[i]){ maxdd = p1.whoWin[i]; k = i; WF = Fist[k]; }
        else if (maxdd == p1.whoWin[i]){ L = i; if (WF > Fist[L]){ WF = Fist[L]; } }
    }
    return WF;
}

四,主函数

void PAT1018(){
    peo A, B;
    A.win = 0; A.draw = 0; A.lose = 0; A.whoWin[0] = 1; A.whoWin[2] = 0; A.whoWin[1] = 0;
    B.win = 0; B.draw = 0; B.lose = 0;  B.whoWin[0] = 1; B.whoWin[2] = 0; B.whoWin[1] = 0;
    int N = 10; 
    string AP= "CJCBBCCJBJ",BP="JBBBCCBBCJ";
    for (int i = 0; i < N; ++i){
        switch (panDuan(AP[i],BP[i],A,B))
        {
        case 1:
        {++A.win; ++B.lose; break; }
        case 2:
        {++A.draw; ++B.draw; break; }
        case 3:
        {++A.lose; ++B.win; break; }
        case 0:
        {cout << "输入错误请检查\n"; }
        }
    }
    cout << A.win << " " << A.draw << " " << A.lose << endl;
    cout << B.win << " " << B.draw << " " << B.lose << endl;
    cout<<winWin(A)<<" "<<winWin(B)<<endl;
}

五,输出结果
PAT1018锤子剪刀布_第1张图片

你可能感兴趣的:(C++,pat)