1. 程式人生 > 其它 >PAT1018 錘子剪刀布 (C語言)

PAT1018 錘子剪刀布 (C語言)

技術標籤: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; } } }