大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 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
解题思路
1.需要注意输入方式,虽然每次只有一个字符输入,但是除了n要用%d接收之外,字母都要用%s来接收, a b是至少为2的字符数组,如果使用%c来接收字母的话 ,因为%d只取到‘\n‘,所以%c会取到‘\n‘
代码写的感觉有些啰嗦了,有待改进
1 #include "stdio.h" 2 int compare(char *m,char *n){//判定胜负并给出胜利手势,正数为甲胜 负数为乙胜 0平 ,绝对值1为锤胜 2为剪胜 3为布胜 3 char a=m[0]; 4 char b=n[0]; 5 int result=0; 6 if(a==b)result=0; 7 if(a==‘C‘&&b==‘J‘)result=1; 8 if(a==‘J‘&&b==‘B‘)result=2; 9 if(a==‘B‘&&b==‘C‘)result=3; 10 if(a==‘J‘&&b==‘C‘)result=-1; 11 if(a==‘B‘&&b==‘J‘)result=-2; 12 if(a==‘C‘&&b==‘B‘)result=-3; 13 return result; 14 } 15 char maxwin(int c,int j,int b){//取得胜场最大的手势,index为0 1 2时分别指B C J 相等时取最小值 16 int arr[3]={b,c,j},max=0,index=0; 17 char str[3]={‘B‘,‘C‘,‘J‘}; 18 for(int i=0;i<3;i++){ 19 if(max<arr[i]){ 20 max=arr[i]; 21 index=i; 22 } 23 } 24 return str[index]; 25 } 26 int main(){ 27 int i,n,result,arrA[6]={0,0,0,0,0,0},arrB[6]={0,0,0,0,0,0};//6个参数为胜 平 负 锤胜 剪胜 布胜 28 char a[2],b[2];//需要字符串取值,如果取字符会让a取到‘\n‘ 29 scanf("%d",&n); 30 for(i=0;i<n;i++){ 31 scanf("%s %s",a,b);//需要字符串取值,如果取字符%c会让a取到‘\n‘ 32 result=compare(a,b);//取得胜负结果然后存入甲乙数组对应参数的位置 33 if(result==0){//平 34 arrA[1]++; 35 arrB[1]++; 36 }else if(result>0){//甲胜 37 arrA[0]++; 38 arrA[result+2]++; 39 arrB[2]++; 40 }else {//乙胜 41 arrB[-result+2]++; 42 arrB[0]++; 43 arrA[2]++; 44 } 45 } 46 printf("%d %d %d\n",arrA[0],arrA[1],arrA[2]); 47 printf("%d %d %d\n",arrB[0],arrB[1],arrB[2]); 48 printf("%c %c\n",maxwin(arrA[3],arrA[4],arrA[5]),maxwin(arrB[3],arrB[4],arrB[5])); 49 return 0; 50 }