您的位置:首页 > 其它

PAT 1018. 锤子剪刀布

2014-05-16 22:32 323 查看
原题链接:http://pat.zju.edu.cn/contests/pat-b-practise/1018

大家应该都会玩“锤子剪刀布”的游戏:两人同时给


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

输入格式:

输入第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>
#include <cstring>
using namespace std;
int playWin(char c1, char c2)
{
if(c1 == c2){
return 0;
}

if(c1 == 'C')
{
if(c2 == 'J'){
return 1;
}
else{
return -1;
}
}
if(c1 == 'J')
{
if(c2 == 'B'){
return 1;
}
else{
return -1;
}
}
if(c1 == 'B')
{
if(c2 == 'C'){
return 1;
}
else{
return -1;
}
}
}
int main()
{
int n;
char sign[3] = {'B', 'C', 'J'};//按字母顺序排序
char c1,c2;
int win_num, draw_num, lose_num;//甲胜、平、败局数
int numOfSign[2][3];//分别表示甲、乙的手势B、C、J胜的局数
while(cin>>n)
{
win_num = draw_num = lose_num = 0;
memset(numOfSign, 0, sizeof(numOfSign));
for(int i=0; i<n; i++)
{
cin>>c1>>c2;
int res = playWin(c1,c2);
if(res>0)
{
win_num++;
for(int j=0; j<3; j++)
{
if(c1 == sign[j])
{
numOfSign[0][j]++;
break;
}
}
}
else if(res<0)
{
lose_num++;
for(int j=0; j<3; j++)
{
if(c2 == sign[j])
{
numOfSign[1][j]++;
break;
}
}
}
else {
draw_num++;
}
}
cout<<win_num<<" "<<draw_num<<" "<<lose_num<<endl;
cout<<lose_num<<" "<<draw_num<<" "<<win_num<<endl;
int max_count = -1;
int idx;
for(int i=0; i<3; i++)
{
if(max_count<numOfSign[0][i])
{
max_count = numOfSign[0][i];
idx = i;
}
}
cout<<sign[idx]<<" ";
max_count = -1;
for(int i=0; i<3; i++)
{
if(max_count<numOfSign[1][i])
{
max_count = numOfSign[1][i];
idx = i;
}
}
cout<<sign[idx]<<endl;
}
return 0;
}


[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: