PAT乙级1008-剪刀石头布

大家应该都会玩“锤子剪刀布”的游戏:

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

 

输入描述:

输入第1行给出正整数N(<=105),即双方交锋的次数。随后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<iostream>
using namespace std;
int win[3] = { 0 };    //全局变量
char max3(int *a)
{                                                        
           char r = 'B' ;                    //C代表“锤子”、J代表“剪刀”、B代表“布”
           if (a [1] > a[0])    //a[0]-布  a[1]-锤子 a[2]-剪刀
          {                                              
                    a[0] = a [1];           //'B'-66  'C'-67  'J'-74
                   r = 'C';
          }
           if (a [2] > a[0])
                   r = 'J';
           return r;
}
int main()
{
           int n;
           char a[105], b[105];
           int awin[3] = { 0 };
           int bwin[3] = { 0 };
          cin >> n;
           for (int i = 0; i < n; i++)
          {
                   cin >> a[i] >> b[i];        //输入阶段
                    int k = (a[i] - b[i]) * (a[i] - b[i]); 
                    if (k == 1)
                             a[i] == 66 ? win[0]++, awin[0]++ : (win[1]++, bwin[0]++);
                    else if (k == 49)
                             a[i] == 67 ? win[0]++, awin[1]++ : (win[1]++, bwin[1]++);
                    else if (k == 64)
                             a[i] == 74 ? win[0]++, awin[2]++ : (win[1]++, bwin[2]++);
                    else
                             win[2]++;
          }
          cout << win[0] << " " << win[2] << " " << win[1] << endl;  //甲胜平负
          cout << win[1] << " " << win[2] << " " << win[0] << endl;  //乙胜平负
          cout << max3(awin) << " " << max3(bwin);
          system( "pause");
           return 0;
}

//by myself
#include<iostream>
using namespace std;
int main()
{
           char a[105] = { 0 }, b[105] = { 0 };
           int n = 0;
           int win = 0, ping = 0, lose = 0;
           int aC = 0, aB = 0, aJ = 0, bC = 0, bB = 0, bJ = 0;
          scanf( "%d", &n);
           for (int i = 0; i < n; i++)
          {
                   scanf( " %c %c", &a[i], &b[i]);
                    if ((a[i] == 'C' ) && (b[i] == 'J')) { win++; aC++; continue; }
                    if ((a[i] == 'J' ) && (b[i] == 'B')) { win++; aJ++; continue; }
                    if ((a[i] == 'B' ) && (b[i] == 'C')) { win++; aB++; continue; }
                    if ((a[i] == 'C' ) && (b[i] == 'C')) { ping++; continue; }
                    if ((a[i] == 'J' ) && (b[i] == 'J')) { ping++; continue; }
                    if ((a[i] == 'B' ) && (b[i] == 'B')) { ping++; continue; }
                    if ((a[i] == 'C' ) && (b[i] == 'B')) { lose++; bB++; continue; }
                    if ((a[i] == 'B' ) && (b[i] == 'J')) { lose++; bJ++; continue; }
                    if ((a[i] == 'J' ) && (b[i] == 'C')) { lose++; bC++; continue; }
          }
          cout << win << " " << ping << " " << lose << endl;
          cout << lose << " " << ping << " " << win << endl;
           if ((aB >= aC) && (aB >= aJ))
                   cout << 'B' << " " ;
           else if (aC >= aJ)
                   cout << 'C' << " " ;
           else
                   cout << 'J' << " " ;
           if ((bB >= bC) && (bB >= bJ))
                   cout << 'B';
           else if (bC >= bJ)
                   cout << 'C' ;
           else
                   cout << 'J' ;
          system( "pause");
           return 0;
}

  

总结:在网上看了一些其他的解法,自己其实也没有想到很好的方法,就模仿者上面的写的,这里有个小逻辑(也算个小技巧吧!)win[0]  win[1]  win[2]只用这三个变量进行统计,当时自己想的是用六个变量进行统计,后来发现,当甲胜的时候,乙肯定是负的,哈哈 ,太蠢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值