问题 I: 锤子剪刀布 (20)

本文介绍了一个关于锤子剪刀布游戏的程序设计问题,通过输入双方的交锋记录,统计并输出双方的胜、平、负次数及获胜次数最多的手势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

19:07:47 2019-04-02


 

问题 I: 锤子剪刀布 (20)

时间限制: 1 Sec  内存限制: 32 MB
提交: 1249  解决: 504
[提交][状态][讨论版][命题人:外部导入]

题目描述

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

 

输入

输入第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

补充一下知识:
结构体数组的排序
typedef struct js{
 char c;
 int w;
}js;
bool cmp(js a,js b){
 return a.w<b.w; //将结构体按照w的大小 将它们从小到大排
}
sort(a,a+3,cmp);//结构体排序要加cmp否则会报错 这个函数在#include<algorithm>头文件中


出乎意料,这道题我竟写的挺复杂的!
说一下几个点:
1、站在赢方(甲)角度,其对应关系
甲 PK 乙
J B
B C
C J
这三种情况都是甲赢
2、关于甲赢、输、平次数——计数问题,一定是数组来存的!+题目要求在甲赢的情况中,出哪个拳是赢得最多的 => 一定是一个结构体 包含两个元素(一是哪个拳(J,B,C)二是这些拳赢得次数)
3、一旦甲解决了,那么乙同理,不过这里可以少一步就是=>1、甲输,必定乙赢,那么你在计甲赢的时候,就可以同时判断甲输的时候从而计乙赢的次数。2、甲输的次数==乙赢的次数
4、这是最重要的一步,很容易忽略(我就忘记这个结果报出:答案错误43%):题目要求:如果解不唯一,则输出按字母序最小的解。(我写的时候,就是这没看到,或者说做之前看到的,码着码着就忘了...)
这个怎么解决?
容易啊,既然我选择保存在一个结构体数组,还排了序,那就从后往前遍历呗,看前面的次数是不是和最后一个次数相同,如果相同还要比较一下字母序...功能实现是在char MinC(js a[]){}函数中

PS:感觉代码不够简洁,写复杂了点..有缘的时候再看看,说不定还是另外一份想法!

代码如下AC:
 1 #include <iostream>
 2 #include<algorithm>
 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 4 using namespace std;
 5 //int a[3];//用于记录获胜次数 'C'为a[0] 'J'为a[1] 'B'为a[2]
 6 /*
 7 C代表“锤子”、J代表“剪刀”、B代表“布”
 8 */ 
 9 typedef struct js{
10     char c;
11     int w;
12 }js;
13 js a[3];
14 js b[3]; 
15 void Init_a(){
16     a[0].w=a[1].w=a[2].w=0;
17     a[0].c='C';
18     a[1].c='J';
19     a[2].c='B';    
20 }
21 
22 void Init_b(){
23     b[0].w=b[1].w=b[2].w=0;
24     b[0].c='J';
25     b[1].c='B';
26     b[2].c='C';    
27 }
28 int judge(char f,char s){
29 //    f为甲方 s为乙方
30     if(f==s) return 0;//表示平手 
31     else{
32         switch(f){
33             case 'C':
34                 if(s=='J'){ a[0].w++; return 1; }
35                 else if(s=='B'){ b[1].w++; return -1;}//表示输了 
36                 
37             case 'J':
38                 if(s=='B'){ a[1].w++; return 1; }
39                 else if(s=='C'){ b[2].w++; return -1;}//表示输了 
40             
41             case 'B':
42                 if(s=='C') { a[2].w++; return 1; }
43                 else if(s=='J'){     b[0].w++; return -1;}//表示输了 
44             
45         }
46     }
47      
48 } 
49 bool cmp(js a,js b){
50     return a.w<b.w;
51 }
52 //0表示平手,1表示甲方赢,-1表示甲方输 
53 char MinC(js a[]){
54     int i;
55     int minc=a[2].c;
56     for(i=1;i>=0;i--){
57         if(a[2].w==a[i].w&&minc>a[i].c){
58             minc=a[i].c;
59         }
60     }
61     return minc;
62 }
63 int main(int argc, char** argv) {
64     int n;
65     int i;
66     int w,f,e;
67     char o,s;
68     while(cin>>n){
69         Init_a();
70         Init_b();
71         getchar();//这个一定要加
72         w=f=e=0;
73         while(n--){    
74             
75             cin>>o>>s;
76             int t=judge(o,s);
77             if(t==1)
78                 w++;
79             if(t==-1)
80                 f++;
81             if(t==0)
82                 e++;
83         } 
84         sort(a,a+3,cmp);//结构体排序要加cmp否则会报错 
85         char _a=MinC(a);
86         
87         sort(b,b+3,cmp);
88         char _b=MinC(b);
89         
90         cout<<w<<" "<<e<<" "<<f<<endl;
91         cout<<f<<" "<<e<<" "<<w<<endl;
92         cout<<_a<<" "<<_b<<endl;
93         
94     }
95     
96     return 0;
97 }

 



转载于:https://www.cnblogs.com/industrial-fd-2019/p/10639001.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值