//1018 锤子剪刀布(20 分)
//大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如下:
//现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
//
//输入格式:
//输入第 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
C:
#include <stdio.h>
char cmp(int winC,int winB,int winJ);
int main()
{
int N;
char line[5];//用于放每次处理的字符串,因为每次"字母 空格 字母 \n \0"
int AwinB = 0,AwinC = 0,AwinJ = 0;
int BwinB = 0,BwinC = 0,BwinJ = 0;
int ping = 0;
scanf("%d", &N);
while ( getchar() != '\n');//现在缓冲区里存放的是1 0 '\n' '\0',这条语句的意义是清空缓存区?
for (int i = 0; i < N; i++) {
fgets(line, 5, stdin);//从标准输入中读入4(5-1)个字符,存储在line中
if (line[0] == line[2]) ping++;
if (line[0] == 'B' && line[2] == 'C') AwinB++;
if (line[0] == 'B' && line[2] == 'J') BwinJ++;
if (line[0] == 'C' && line[2] == 'B') BwinB++;
if (line[0] == 'C' && line[2] == 'J') AwinC++;
if (line[0] == 'J' && line[2] == 'B') AwinJ++;
if (line[0] == 'J' && line[2] == 'C') BwinC++;
}
int Awin = AwinC + AwinB + AwinJ;
int Bwin = BwinC + BwinB + BwinJ;
printf("%d %d %d\n", Awin, ping,Bwin);
printf("%d %d %d\n", Bwin, ping,Awin);
printf("%c %c",cmp(AwinC, AwinB, AwinJ),cmp(BwinC, BwinB, BwinJ));
return 0;
}
char cmp(int winC,int winB,int winJ)
{
char f;
if (winB >= winC && winB >= winJ) f = 'B';//等号只能出现一次,出现在字母序小的上
if (winC > winB && winC >= winJ) f = 'C';
if (winJ > winB && winJ > winC) f = 'J';
return f;
}
这道题做了蛮久,一方面是对多行数据输入的处理不熟悉,花了较长时间去看了getchar 和 fgets,主要问题 while ( getchar() != '\n');的作用,目前分析看来是为了把缓冲区里的N给清除,防止后面fgets的时候错读,不知道是否理解正确。
另外这题OliverLew的比较函数有多个出口,翁恺老师说尽量单一出口,因此对比较函数做了变动。
网友评论