PAT乙级——1018剪刀锤子布

自己后面判断第三行输出的代码写的太冗余太垃圾,只拿到一半分数,刚踢完球累死,下次再改改。。

1018 锤子剪刀布 (20 分)

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

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
#include <iostream>
#include <string>
using namespace std;

int main(){
	
	int n;
	cin>>n;
	char A[n],B[n];
	
	int win=0,lose=0,flat=0;//甲赢和输的次数 
	int A_chuizi=0,A_jiandao=0,A_bu=0;//记录甲赢时候的状态 
	int B_chuizi=0,B_jiandao=0,B_bu=0;//记录乙赢时候的状态 
	for(int i=0;i<n;i++){
		cin>>A[i]>>B[i];
		if(A[i]==B[i])
			flat++;
		else if((A[i]=='C'&&B[i]=='J')||(A[i]=='B'&&B[i]=='C')||(A[i]=='J'&&B[i]=='B')){
			win++;
			if(A[i]=='C')
				A_chuizi++;
			if(A[i]=='J')
				A_jiandao++;
			if(A[i]=='B')
				A_bu++;
		}
		else{
			lose++;
			if(B[i]=='C')
				B_chuizi++;
			if(B[i]=='J')
				B_jiandao++;
			if(B[i]=='B')
				B_bu++;
		}
	}
	
	cout<<win<<" "<<flat<<" "<<lose<<endl;
	cout<<lose<<" "<<flat<<" "<<win<<endl;
	
	if(A_chuizi>=A_jiandao){
		if(A_jiandao>=A_bu){
			cout<<"C";
		}else if(A_chuizi>A_jiandao){
			cout<<"C";
		}else{
			cout<<"B";
		}
	}else{
		if(A_chuizi>=A_bu){
			cout<<"J";
		}else if(A_bu>=A_jiandao){
			cout<<"B";
		}else{
			cout<<"J";
		}
	}
	cout<<" ";
	if(B_chuizi>=B_jiandao){
		if(B_jiandao>=B_bu){
			cout<<"C";
		}else if(B_chuizi>B_jiandao){
			cout<<"C";
		}else{
			cout<<"B";
		}
	}else{
		if(B_chuizi>=B_bu){
			cout<<"J";
		}else if(B_bu>=B_jiandao){
			cout<<"B";
		}else{
			cout<<"J";
		}
	}
	cout<<endl;
	
	return 0;
}

 人家的写的精简多了。。gg

/* 用 getchar() 或 scanf()时写明\n,避免回车被%c读取 */
#include <stdio.h>

int main() {
    int N, Awin = 0, Alose = 0;//交锋次数,A赢的次数 和 输的次数
    char A, B;
    int cnt_A[3] = {0}, cnt_B[3] = {0};//统计各手势获胜的次数 
    scanf("%d", &N); 
    for (int i = 0; i < N; i++) {
        getchar(); // %c会将回车、空格、换行读入 
        scanf("%c %c", &A, &B); 
        if (A == 'B' && B == 'C') {// 注意手势计数下标要正确 
            Awin++;
            cnt_A[0]++;
        } else if (A == 'B' && B == 'J') {
            Alose++;
            cnt_B[2]++;
        } else if (A == 'C' && B == 'J') {
            Awin++;
            cnt_A[1]++;
        } else if (A == 'C' && B == 'B') {
            Alose++;
            cnt_B[0]++;
        } else if (A == 'J' && B == 'B'){
            Awin++;
            cnt_A[2]++;
        } else if (A == 'J' && B == 'C') {
            Alose++;
            cnt_B[1]++;
        } 
    }
    printf("%d %d %d\n", Awin, N - Awin - Alose, Alose);
    printf("%d %d %d\n", Alose, N - Awin - Alose, Awin);
    int maxA = (cnt_A[1] >= cnt_A[2]) ? 1 : 2;
    maxA = (cnt_A[0] >= cnt_A[maxA]) ? 0 : maxA; 
    int maxB = (cnt_B[1] >= cnt_B[2]) ? 1 : 2;
    maxB = (cnt_B[0] >= cnt_B[maxB]) ? 0 : maxB; 
    char str[4] = {"BCJ"};
    printf("%c %c\n", str[maxA], str[maxB]); 
    return 0; 
}

就是可读性有点差,不如自己再写。。

发布了228 篇原创文章 · 获赞 76 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/102963162