PAT1018 錘子剪刀布 (C語言)
阿新 • • 發佈:2021-02-13
技術標籤:PAT乙級題
1018 錘子剪刀布 (20 分)
大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:
現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。
輸入格式:
輸入第 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
注意
第一點,如果解不唯一,則輸出按字母序最好的解,則宣告字元陣列時可按字母序從小到大的順序
第二點,題目要求輸出甲乙的勝平負同時要輸出獲勝次數最多的手勢,則表明需要四個陣列(方便記錄)有兩個,一個記錄甲的勝平負,一個記錄勝的手勢的次數,另外兩個記錄乙的
程式碼
#include<stdio.h>
int main()
{
char zimu[3]={'B','C','J'};//B布,C石頭,J剪刀//按此順序排序,解決了相同值時輸出最小序的手勢
int a[3]={0},b[3]={0};//陣列a記錄甲勝負平成績,陣列b記錄甲勝的手勢的次數
int c[3]={0},d[3]={0};//陣列c,d依次記錄乙的
int n;
scanf("%d",&n);
while(n--)//n組資料
{
getchar();
char p,q;
scanf("%c %c",&p,&q);
if(p==q)//甲乙平了
{
a[1]++;
c[ 1]++;
}
else if(p=='B'&&q=='C')//甲贏了,手勢B
{
a[0]++;
b[0]++;
c[2]++;
}
else if(p=='B'&&q=='J')//乙贏了,手勢J
{
a[2]++;
c[0]++;
d[2]++;
}
else if(p=='C'&&q=='J')//甲贏了,手勢C
{
a[0]++;
b[1]++;
c[2]++;
}
else if(p=='C'&&q=='B')//乙贏了,手勢B
{
a[2]++;
c[0]++;
d[0]++;
}
else if(p=='J'&&q=='B')//甲贏了,手勢J
{
a[0]++;
b[2]++;
c[2]++;
}
else if(p=='J'&&q=='C')//乙贏了,手勢C
{
a[2]++;
c[0]++;
d[1]++;
}
}
printf("%d %d %d\n",a[0],a[1],a[2]);
printf("%d %d %d\n",c[0],c[1],c[2]);
int max1,max2;//找最大值
max1=b[0]>b[1]?b[0]:b[1];
max1=max1>b[2]?max1:b[2];
max2=d[0]>d[1]?d[0]:d[1];
max2=max2>d[2]?max2:d[2];
int i;
for(i=0;i<3;i++)
{
if(max1==b[i])
{
printf("%c ",zimu[i]);
break;
}
}
for(i=0;i<3;i++)
{
if(max2==d[i])
{
printf("%c\n",zimu[i]);
break;
}
}
}