PAT乙級 剪刀錘子布 題解

2021-09-11 12:08:36 字數 2010 閱讀 6671

輸入第1行給出正整數n(<=105),即雙方交鋒的次數。隨後n行,每行給出一次交鋒的資訊,即甲、乙雙方同時給出的的手勢。c代表「錘子」、j代表「剪刀」、b代

表「布」,第1個字母代表甲方,第2個代表乙方,中間有1個空格。

輸出第1、2行分別給出甲、乙的勝、平、負次數,數字間以1個空格分隔。第3行給出兩個字母,分別代表甲、乙獲勝次數最多的手勢,中間有1個空格。如果解不唯

一,則輸出按字母序最小的解。

這個題的兩個難點:

1、如何進行輸贏的判斷?

2、如何才能夠在存在手勢勝率相同的情況下,按照 j c b的順序輸出手勢?

設定計分板table[2][3]每行代表勝利、平局、失敗的次數;對手勢進行編號(j=0 c=1 b=2);

int change(char c)
接下來設定獲勝手勢次數的計數板count[2][3] ,count[0][i]代表著甲出j(i=0) c(i=1) b(i=2) 的獲勝次數。這樣如果想要輸出獲勝次數最多的手勢,直接檢查count相應行的最大值就可以了;如果有的手勢獲勝的次數相同,由於每列是按照j c b排列的(字典序降序),因此只要取後面的值就可以了,這樣解決了輸出順序問題。

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

}

接下來解決輸贏判斷問題,個人認為自己的方法比《演算法筆記》的簡單、能接受許多。

這裡仍然設定剪子(j) 為0,錘子(c)標號為1 ,布(b)的標號為2,並以此構建乙個矩陣blank[a][b];這裡設定贏為0 平局為1 輸為2,與table中的贏 平 輸所代表的列座標相對應。

int blank[3][3] = ; 

/*table =

*/

每次判斷輸贏的時候,只要讓table[0][blank[a][b]]的計數值累加即可。

舉例說,如果甲的手勢為j 乙的手勢為b,檢視blank[0][3]=0,對應的甲的勝利次數+1 也就是table[0][0]++;

然後反過來統計乙的勝敗,檢視blank[3][0]=2,對應的乙的失敗次數+1,也就是table[1][2]++;

table[0][blank[a][b]]++;

table[1][blank[b][a]]++;

if(blank[a][b] == 0)

if(blank[b][a] == 0)

最終的**如下:

#includeusing namespace std;

int blank[3][3] = ; //勝0 負2 平1 直接輸入到table中 橫向縱向分別是剪子(j) 錘子(c) 包袱(b) 這樣可以解決輸出排序問題

int table[2][3]; //計分板

int count[2][3]; //統計獲勝時出的什麼姿勢 (j c b)

char back[3] = ; //輸出手勢的時候,把標號返回為符號

int change(char c)

void mark(int a,int b)

if(blank[b][a] == 0)

}int main()

} int n;

char no_use; //由於輸入n後會有乙個切行鍵,切行鍵會被後面for迴圈中的gets()吸收,導致輸入錯誤,因此這裡用乙個字元把no_use吸收掉,保證輸入正確性

scanf("%d",&n); scanf("%c",&no_use); //應對切行鍵

for(int i=0;i= maxa)

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

} printf("%d %d %d\n",table[0][0],table[0][1],table[0][2]);

printf("%d %d %d\n",table[1][0],table[1][1],table[1][2]);

printf("%c %c\n",wina,winb);

}

PAT乙級題解(1018 錘子剪刀布)

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

PAT 乙級 1018 錘子剪刀布

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

PAT乙級1018 錘子剪刀布

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