题目
链接:PAT (Basic Level) Practice 1018 锤子剪刀布
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数,即双方交锋的次数。随后 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<stdio.h>
#include<string.h>
int judge(char A, char B);
char maxwin(int c, int j, int b);
int main()
{
int N;
scanf("%d", &N);
getchar();
int A_win = 0, A_draw = 0, A_lose = 0;
int A_c = 0, A_j = 0, A_b = 0, B_c = 0, B_j = 0, B_b = 0;
char A, B;
char A_max, B_max;
int result;
for(int i = 0; i < N; i++){
scanf("%c %c", &A, &B);
getchar();
result = judge(A, B);
if(result == 0){
A_draw++;
}
else if(result == 1){
A_win++;
if(A == 'C') A_c++;
else if(A == 'J') A_j++;
else A_b++;
}
else if(result == -1){
A_lose++;
if(B == 'C') B_c++;
else if(B == 'J') B_j++;
else B_b++;
}
}
A_max = maxwin(A_c, A_j, A_b);
B_max = maxwin(B_c, B_j, B_b);
printf("%d %d %d\n", A_win, A_draw, A_lose);
printf("%d %d %d\n", A_lose, A_draw, A_win);
printf("%c %c\n", A_max, B_max);
return 0;
}
//判断输赢
int judge(char A, char B){
int result;
if(A == B) result = 0;
else if((A == 'C' && B == 'J')||(A == 'J' && B == 'B')||(A == 'B' && B == 'C')) result = 1;
else result = -1;
return result;
}
//判断赢次数最多的手势
char maxwin(int c, int j, int b){
char max;
if(b >= c){
if(b >= j){
max = 'B';
}
else{
max = 'J';
}
}
else if(c >= j){
max = 'C';
}
else{
max = 'J';
}
return max;
}
网友评论