PAT乙級 1018 錘子剪刀布 20

2021-07-15 05:29:46 字數 2166 閱讀 8288

大家應該都會玩「錘子剪刀布」的遊戲:兩人同時給出手勢,勝負規則如圖所示:

現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。

輸入格式:

輸入第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 bpat鏈結

b——0

c——1

j ——2

1.寫乙個轉化函式,將b,c,j轉化成數字0,1,2便於比較

2.判斷勝負條件,可以看出b,c,j之間形成乙個環,可以用如下**實現

if((na+1)%3 == nb)  //甲勝

else

if(na == nb) //甲乙平

else

//乙勝

3.比較得到勝利次數最多的手勢,輸出資訊。

/**

*@tag pat_b_1018

*@date 2016-07-19 14:34:16-15:23

*@version 1.0

*@language c++

*@ranking 155/3936

*/#include #include #include /*將char轉化為int變與比較*/

int char_to_num(char ch)

/*將int轉化為char用來輸出*/

char num_to_char(int k)

int main()

, cntb[3]=; //用於統計勝平負次數

int timea[3]= ,timeb[3] = ; //用於統計每種手勢獲勝次數

scanf("%d", &n);

while(n--)

else

if(na == nb) //甲乙平

else

//乙勝

}maxa = timea[0];

ca = 'b';

maxb = timeb[0];

cb = 'b';

for(int i = 0; i<3; i++)

printf("%d",cnta[i]);

if(i < 2)

printf(" ");

else

printf("\n");

}for(int i = 0; i<3; i++)

printf("%d",cntb[i]);

if(i < 2)

printf(" ");

else

printf("\n");

}printf("%c %c\n",ca,cb);

return

0;}

1。最大的收穫是將這種形成環的字元轉化為數字比較,並且用類似

if((na+1)%3 == nb)
這樣的**進行判斷會方便很多。

2。由於scanf使用%c時會將換行符\n讀入,因此需要在合適的地方用getchar吸收空格。(以後碰到類似讀取字元的題目第一時間想要不要用getchar())。

3。甲贏得時候同時要記乙負,乙贏得時候同時要記加負,這是成對出現的。

PAT 乙級 1018 錘子剪刀布

時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 大家應該都會玩 錘子剪刀布 的遊戲 兩人同時給出手勢,勝負規則如圖所示 現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入格式 ...

PAT乙級1018 錘子剪刀布

現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入格式 輸入第1行給出正整數n 10 5 即雙方交鋒的次數。隨後n行,每行給出一次交鋒的資訊,即甲 乙雙方同時給出的的手勢。c代表 錘子 j代表 剪刀 b代表 布 第1個字母代表甲方,第2個代表乙方,中間有1個...

PAT 乙級 1018 錘子剪刀布

大家應該都會玩 錘子剪刀布 的遊戲 兩人同時給出手勢,勝負規則如圖所示 現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入第 1 行給出正整數 n 10 5 即雙方交鋒的次數。隨後 n 行,每行給出一次交鋒的資訊,即甲 乙雙方同時給出的的手勢。c 代表 錘子...