PAT Basic 1018 锤子剪刀布
题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344
很简单但是写起来很恶心的一道题。。主要考察逻辑和输入输出。
#include <stdio.h>
#include <stdlib.h>
// 判断输赢的逻辑, 1->a赢,0—>b赢,-1平局
int judge(char a, char b){
if(a == b){
return -1;
}else if(a == 'C'){
return b == 'J';
}else if(a == 'B'){
return b == 'C';
}else if(a == 'J'){
return b == 'B';
}
}
// 注意并列的情况,输出排前面的字母
char max(int arr[]){
char chs[3] = {'J','C','B'};
int j = 0;
int max = -1;
for(int i = 0; i < 3; i++){
if(arr[i] >= max){
max = arr[i];
j = i;
}
}
return chs[j];
}
int main(){
int N;
int A_win = 0; // A赢的场数
int tie = 0; // 平局的场数
int A_win_count[3] = {0}; // 下标0,1,2 分别代表 J C B三个手势,记录三个手势赢了的场数
int B_win_count[3] = {0};
scanf("%d",&N);
for(int i=0; i < N; i++){
char a,b,space,re;
getchar(); // 要吞掉换行符
scanf("%c %c",&a,&b);
int result = judge(a,b);
if(result == 1){
switch(a){
case 'J': A_win_count[0]++;break;
case 'C': A_win_count[1]++;break;
case 'B': A_win_count[2]++;break;
}
A_win++;
}else if(result == 0){
switch(b){
case 'J': B_win_count[0]++;break;
case 'C': B_win_count[1]++;break;
case 'B': B_win_count[2]++;break;
}
}else if(result == -1){
tie++;
}
}
int B_win = N - A_win - tie;
printf("%d %d %d\n",A_win,tie,B_win);
printf("%d %d %d\n",B_win,tie,A_win);
printf("%c %c",max(A_win_count),max(B_win_count));
return 0;
}
启发:
(maybe?)有时候不能一味只求代码短,特别是像这种逻辑比较多,变量比较多的题,多写几行能保证清晰进而减少错误,方便debug。 当然大佬们就随意啦哈哈。。