B1018 锤子剪刀布
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 N(≤),即双方交锋的次数。随后 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
自己解法(if语句较多,且不具有概括性,仅限3个元素)
#include <cstdio>
int main(){
int n;
char a,b;
scanf("%d",&n);
int win=0,draw=0,lose=0;
int cc1=0,cj1=0,cb1=0,cc2=0,cj2=0,cb2=0;
while(n--){
getchar();
scanf("%c %c",&a,&b);
if(a==b)
draw++;
if(a=='C'){
if(b=='J'){
win++;
cc1++;
}
else if(b=='B'){
lose++;
cb2++;
}
}
if(a=='J'){
if(b=='B'){
win++;
cj1++;
}
else if(b=='C'){
lose++;
cc2++;
}
}
if(a=='B'){
if(b=='C'){
win++;
cb1++;
}
else if(b=='J'){
lose++;
cj2++;
}
}
}
printf("%d %d %d\n",win,draw,lose);
printf("%d %d %d\n",lose,draw,win);
int max1,max2;
max1=cb1;
a='B';
if(cc1>max1){
max1=cc1;
a='C';
}
if(cj1>max1){
max1=cj1;
a='J';
}
max2=cb2;
b='B';
if(cc2>max2){
max2=cc2;
b='C';
}
if(cj2>max2){
max2=cj2;
b='J';
}
printf("%c %c",a,b);
}
算法笔记解法
1.建立一个数组mp[3]={B,C,J},可将每次读入的字符转化成数字,用数字进行对比,之后计算获胜次数较多的手势也方便。
2.getchar()吸收\n
#include <cstdio>
int change(char c){
if(c=='B') return 0;
if(c=='C') return 1;
if(c=='J') return 2;
}
int main(){
char mp[3]={'B','C','J'};
int n;
scanf("%d",&n);
int times_A[3]={0},times_B[3]={0}; //记录甲和乙的胜,平,负次数
int hands_A[3]={0},hands_B[3]={0}; //按BCJ顺序记录3种手势的获胜次数
char c1,c2;
int k1,k2;
while(n--){
getchar(); //吸收\n
scanf("%c %c",&c1,&c2);
k1=change(c1);
k2=change(c2);
if((k1+1)%3==k2){ //甲赢
times_A[0]++;
times_B[2]++;
hands_A[k1]++;
}
else if(k1==k2){ //平
times_A[1]++;
times_B[1]++;
}
else{ //乙赢
times_A[2]++;
times_B[0]++;
hands_B[k2]++;
}
}
printf("%d %d %d\n",times_A[0],times_A[1],times_A[2]);
printf("%d %d %d\n",times_B[0],times_B[1],times_B[2]);
int id1=0,id2=0;
for(int i=0;i<3;i++){
if(hands_A[i]>hands_A[id1]) id1=i;
if(hands_B[i]>hands_B[id2]) id2=i;
}
printf("%c %c\n",mp[id1],mp[id2]);
return 0;
}
浙公网安备 33010602011771号