Skip to content

Latest commit

 

History

History
153 lines (121 loc) · 3.64 KB

6172.md

File metadata and controls

153 lines (121 loc) · 3.64 KB

6172题目描述:锤子剪刀布

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

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

  • 输入

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


两种方法:

方法(1) 只用统计甲和乙各自赢的次数,n-(j_win + y_win) = 平局的次数 str[4];手势字符串,j[3], y[3],统计每个手势获胜的次数 max_j : 获胜次数最多手势,在str中的索引

#include <iostream>
using namespace std;
int main() {
    char str[4] = {"CJB"},a , b;
    int j_win = 0 , y_win = 0, n;
    int j[3] = {0}, y[3] = {0};
    cin >>n;
    for (int i = 0; i < n ; i++) {
        cin >> a >> b;         //甲乙的手势
        if (a == 'C' && b == 'J') {
            j_win++;
            j[0]++;
        } else if (a == 'C' && b == 'B') {
            y_win++;
            y[2]++;
        } else if (a == 'J' && b == 'B') {
            j_win++;
            j[1]++;
        } else if (a == 'J' && b == 'C') {
            y_win++;
            y[0]++;
        } else if (a == 'B' && b == 'J') {
            y_win++;
            y[1]++;
        } else if (a == 'B' && b == 'C') {
            j_win++;
            j[2]++;
        }
    }
    int max_j = j[0] >= j[1] ? 0 : 1;
    max_j = j[max_j] >= j[2] ? max_j : 2;
    int max_y = y[0] >= y[1] ? 0 : 1;
    max_y = y[max_y] >= y[2] ? max_y : 2;
    cout <<j_win<<' '<<n-(j_win+y_win)<<' '<<y_win<<endl;
    cout <<y_win<<' '<<n-(j_win+y_win)<<' '<<j_win<<endl;
    cout <<str[max_j]<<' '<<str[max_y]<<endl;
    return 0;
}

方法(二): 布:B, 锤:C,剪:J,按照字典顺序转化为数字 B : 0, C : 1, J : 2; 举个例子:

if (((int)a + 1) %3 == (int)b):
    j_win++;
    j[(int)a]++;

(int)a ,(int) b并真正的强制类型转化,只是表示将,a,b甲乙的手势字符,转化为对应的数字 如果甲>乙:C > J (1+1)%3=2 = J,所以 甲win.

#include <iostream>
using namespace std;
int transform(char c) {
    if (c == 'B') return 0;
    if (c == 'C') return 1;
    if (c == 'J') return 2;
}
int main() {
    char str[4] = "BCJ",a , b;
    int j_win = 0 , y_win = 0, n;
    int j[3] = {0}, y[3] = {0};
    cin >>n;
    for (int i = 0; i < n ; i++) {
        cin >> a >> b;
        int k1 = transform(a);
        int k2 = transform(b);
        if ((k1+1)%3 == k2) {
            j_win++;
            j[k1]++;
        }
        else if (k1 == k2)
            continue;
        else {
            y_win++;
            y[k2]++;
        }
    }
    int max_j = j[0] >= j[1] ? 0 : 1;
    max_j = j[max_j] >= j[2] ? max_j : 2;
    printf("%d %d %d",j[0],j[1],j[2]);
    int max_y = y[0] >= y[1] ? 0 : 1;
    max_y = y[max_y] >= y[2] ? max_y : 2;
    cout <<j_win<<' '<<n-(j_win+y_win)<<' '<<y_win<<endl;
    cout <<y_win<<' '<<n-(j_win+y_win)<<' '<<j_win<<endl;
    cout <<str[max_j]<<' '<<str[max_y]<<endl;
    return 0;
}