您的位置:首页 > 其它

PAT1018锤子剪刀布

2015-10-06 11:11 363 查看
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

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

解题思路:一个函数用来统计胜负,一个用来统计出哪种拳胜率最高。

一,参赛者结构体,包含了胜负平的次数,与获胜时出拳的记录

struct peo{
int win;
int draw;
int lose;
int whoWin[3];
};


二,判断函数,根据剪刀石头布的规则来判断胜负,并肩负记录“胜拳”的功能

int panDuan(char a, char b,peo &p1,peo &p2){
if (a == 'C'&&b == 'J'){++p1.whoWin[0] ; return 1; }
else if (a == 'J'&&b == 'B'){ ++p1.whoWin[1]; return 1; }
else if (a == 'B'&&b == 'C'){ ++p1.whoWin[2]; return 1; }
else if (a == b)return 2;
else if (a == 'J'&&b == 'C'){ ++p2.whoWin[0]; return 3; }
else if (a == 'B'&&b == 'J'){ ++p2.whoWin[1]; return 3; }
else if (a == 'C'&&b == 'B'){ ++p2.whoWin[2]; return 3; }
else return 0;
}


三,输出甲、乙获胜次数最多的手势。如果解不唯一,则输出按字母序最小的解

char winWin(peo p1){
char Fist[3] = { 'C', 'J', 'B' };
char WF = 'X';
int k = 0,L=0;
int maxdd = -1;
for (int i = 0; i < 3; ++i){
if (maxdd < p1.whoWin[i]){ maxdd = p1.whoWin[i]; k = i; WF = Fist[k]; }
else if (maxdd == p1.whoWin[i]){ L = i; if (WF > Fist[L]){ WF = Fist[L]; } }
}
return WF;
}


四,主函数

void PAT1018(){
peo A, B;
A.win = 0; A.draw = 0; A.lose = 0; A.whoWin[0] = 1; A.whoWin[2] = 0; A.whoWin[1] = 0;
B.win = 0; B.draw = 0; B.lose = 0;  B.whoWin[0] = 1; B.whoWin[2] = 0; B.whoWin[1] = 0;
int N = 10;
string AP= "CJCBBCCJBJ",BP="JBBBCCBBCJ";
for (int i = 0; i < N; ++i){
switch (panDuan(AP[i],BP[i],A,B))
{
case 1:
{++A.win; ++B.lose; break; }
case 2:
{++A.draw; ++B.draw; break; }
case 3:
{++A.lose; ++B.win; break; }
case 0:
{cout << "输入错误请检查\n"; }
}
}
cout << A.win << " " << A.draw << " " << A.lose << endl;
cout << B.win << " " << B.draw << " " << B.lose << endl;
cout<<winWin(A)<<" "<<winWin(B)<<endl;
}


五,输出结果

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