1018 錘子剪刀布 (20 分)
大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,并且給出雙方分别出什麼手勢的勝算最大。
輸入格式:
輸入第 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
複制
我的思路
首先讀取輸入個數,然後再一邊讀入雙方的出拳一邊計算輸赢,自定義輸赢函數來判斷輸赢和平手。然後使用vector來儲存出拳情況完成第三行的輸出,赢次數最多的出拳。
// 1018 錘子剪刀布 (20 分).cpp : 此檔案包含 "main" 函數。程式執行将在此處開始并結束。
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//判斷輸赢
//傳回:3:平;2:B赢;1:A赢。
int judgeWin(char A, char B) {
if (A == B)
return 3;
//A是錘子
if (A == 'C') {
//B是剪刀
if (B == 'J')
return 1;
//B是布
else if (B == 'B') {
return 2;
}
}
//A是剪刀
else if (A == 'J') {
//B是布
if (B == 'B')
return 1;
else if (B == 'C')
return 2;
}
else if(A == 'B'){
if (B == 'J')
return 2;
else if (B == 'C')
return 1;
}
return 0;
}
//統計出現最多次數的字元
char Max_appear(vector<char> a) {
int number_c = 0;
int number_b = 0;
int number_j = 0;
for (int i = 0; i < a.size(); i++) {
if (a[i] == 'B')
number_b++;
else if (a[i] == 'C')
number_c++;
else
number_j++;
}
if (number_b >= number_c && number_b >= number_j)
return 'B';
if (number_c >= number_b && number_c >= number_j)
return 'C';
if (number_j >= number_c && number_j >= number_b)
return 'J';
return 0;
}
int main(){
//輸入
int number_battle;
char A, B;
cin >> number_battle;
int i = number_battle;
vector<char> a;
vector<char> b;
int a_win = 0;
int b_win = 0;
int equal = 0;
//輸入同時記錄
while (i) {
cin >> A >> B;
//甲赢
if (judgeWin(A, B) == 1) {
a.push_back(A);
a_win++;
}
else if (judgeWin(A, B) == 2) {
b.push_back(B);
b_win++;
}
else {
equal++;
}
i--;
}
cout << a_win << " " << equal << " " << number_battle - a_win - equal << endl;
cout << b_win << " " << equal << " " << number_battle - b_win - equal<< endl;
cout << Max_appear(a) << " " << Max_appear(b);
}
複制
一次就跑成功了,我覺得唯一要注意的點就是按字母順序輸出那裡,先判斷B然後C最後J就可以了。不是最優化的代碼,看看别人部落格的代碼。感覺ummmm差不太多。
#include<iostream>
using namespace std;
void AlterCh(char c,char &ch)//判定哪個手勢赢
{
if(c=='C')
ch='C';
else if(c=='J')
ch='J';
else
ch='B';
}
int Judge(char ch1,char ch2,char &ch)//判定赢的一家及赢的手勢
{
if(ch1==ch2)
return 0;//若平則傳回0
if(ch1=='C'&&ch2=='J'||ch1=='J'&&ch2=='B'||ch1=='B'&&ch2=='C')
{//若甲赢則記錄手勢并傳回1
AlterCh(ch1,ch);
return 1;
}
AlterCh(ch2,ch);
return -1;//若乙赢則記錄手勢并傳回-1
}
void Handle(int *a,char ch)//統計勝利及手勢赢的次數
{
a[3]++;
if(ch=='C')
a[0]++;
else if(ch=='J')
a[1]++;
else
a[2]++;
}
char Compare(int cntC,int cntJ,int cntB)//比較各赢的手勢次數
{
if(cntB>=cntJ&&cntB>=cntC)
return 'B';
else if(cntC>cntB&&cntC>=cntJ)
return 'C';
else
return 'J';
}
int main()
{//a[i]:i=0-2:C,J,B赢的次數, i=3,4:勝,平的次數
int N,A[5]={0},B[5]={0};
char ch1,ch2,ch;
cin>>N;
while(N--)
{
cin>>ch1>>ch2;
if(Judge(ch1,ch2,ch)==1)
Handle(A,ch);
else if(Judge(ch1,ch2,ch)==-1)
Handle(B,ch);
else
{//統計平的次數
A[4]++;
B[4]++;
}
}
cout<<A[3]<<' '<<A[4]<<' '<<B[3]<<endl;
cout<<B[3]<<' '<<B[4]<<' '<<A[3]<<endl;
cout<<Compare(A[0],A[1],A[2])<<' '<<Compare(B[0],B[1],B[2]);
return 0;
}
————————————————
版權聲明:本文為CSDN部落客「18Temp」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/qq_37729102/article/details/81673773
複制