题目描述:
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第 1 行给出正整数 ,即双方交锋的次数。随后 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
代码示例(C++实现)
#include <stdio.h>
#include <iostream>
using namespace std;
// // 函数声明
int result(char a, char b);
int max(int a, int b);
int main()
{
int count = 0;
// scanf("%d", &count);
cin >> count;
int arr1[3];
int arr2[3];
for (int i = 0; i < 3; i++) {
arr1[i] = 0;
arr2[i] = 0;
}
// 记录每一种手势赢得个数
int asign[26];
int bsign[26];
for (int i = 0; i < 26; i++)
{
asign[i] = 0;
bsign[i] = 0;
}
for (int i = 0; i < count; i++) {
char c1, c2;
// scanf("%c", &c1);
// scanf("%c", &c2);
cin >> c1 >> c2;
int status = result(c1, c2);
// 如果 平局
switch (status) {
case 0:
arr1[1]++;
arr2[1]++;
break;
case 1:
// 如果 a 胜利
arr1[0]++;
arr2[2]++;
asign[c1 - 'A']++;
break;
case -1:
// 如果 b 胜利
arr2[0]++;
arr1[2]++;
bsign[c2 - 'A']++;
}
}
printf("%d %d %d\n", arr1[0], arr1[1], arr1[2]);
printf("%d %d %d\n", arr2[0], arr2[1], arr2[2]);
int amax = max(asign['B' - 'A'], max(asign['C' - 'A'], asign['J' - 'A']));
int bmax = max(bsign['B' - 'A'], max(bsign['C' - 'A'], bsign['J' - 'A']));
// cout << amax << " , " << bmax << endl;
// cout << asign['B' - 'A'] << ", " << asign['C' - 'A'] << ", " << asign['J' - 'A'] << endl;
// 输出结果
char a, b;
// 处理 a
if (amax == asign['B' - 'A']) {
a = 'B';
} else if (amax == asign['C' - 'A']) {
a = 'C';
} else {
a = 'J';
}
// 处理 b
if (bmax == bsign['B' - 'A']) {
b = 'B';
} else if (bmax == bsign['C' - 'A']) {
b = 'C';
} else {
b = 'J';
}
printf("%c %c\n", a, b);
return 0;
}
int max(int a, int b)
{
return a > b ? a : b;
}
int result(char a, char b) {
if (a == b)
return 0;
if ((a == 'B' && b == 'C') || (a == 'C' && b == 'J') || (a == 'J' && b == 'B'))
return 1;
return -1;
}
代码实现(Java实现,但是最后一个点过不去)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Map;
import java.util.HashMap;
/**
* @author snowflake
* @create-date 2019-07-18 18:40
*/
public class Main {
/**
* 总共有九种情况
*/
static Map<String, Integer> statusMap = new HashMap<>();
static {
statusMap.put("BB", 0);
statusMap.put("CC", 0);
statusMap.put("JJ", 0);
statusMap.put("BC", 1);
statusMap.put("CJ", 1);
statusMap.put("JB", 1);
statusMap.put("CB", -1);
statusMap.put("JC", -1);
statusMap.put("BJ", -1);
}
public static void main(String[] args) throws IOException {
Reader.init(System.in);
int[] arr1 = new int[3];
int[] arr2 = new int[3];
// 记录每一种手势赢的个数
// a
int[] asign = new int[26];
int[] bsign = new int[26];
int count = Reader.nextInt();
for (int i = 0; i < count; i++) {
int c1 = Reader.next().charAt(0);
int c2 = Reader.next().charAt(0);
int status = result(c1, c2);
// 如果 平局
switch (status) {
case 0:
arr1[1]++;
arr2[1]++;
break;
case 1:
// 如果 a 胜利
arr1[0]++;
arr2[2]++;
asign[c1 - 'A']++;
break;
case -1:
// 如果 b 胜利
arr2[0]++;
arr1[2]++;
bsign[c2 - 'A']++;
break;
default:
}
}
// 输出每人的对应的次数
System.out.println(arr1[0] + " " + arr1[1] + " " + arr1[2]);
System.out.println(arr2[0] + " " + arr2[1] + " " + arr2[2]);
// 输出最熟练的手势
// 获取每人最熟练的赢的次数
int amax = Math.max(Math.max(asign['B' - 'A'], asign['C' - 'A']), asign['J' - 'A']);
int bmax = Math.max(Math.max(bsign['B' - 'A'], bsign['C' - 'A']), bsign['J' - 'A']);
// 输出结果
String a, b;
// 处理 a
if (amax == asign['B' - 'A']) {
a = "B";
} else if (amax == asign['C' - 'A']) {
a = "C";
} else {
a = "J";
}
// 处理 b
if (bmax == bsign['B' - 'A']) {
b = "B";
} else if (bmax == bsign['C' - 'A']) {
b = "C";
} else {
b = "J";
}
System.out.println(a + " " + b);
}
/**
*
* @param a a 字符
* @param b b 字符
* @return 0: 平局 -1:a 输 b 赢 1:a 赢 b 输
*/
public static int result(int a, int b) {
// 如果两个字符一样,平局
return statusMap.get((char) a + "" + (char) b);
}
}
class Reader {
static BufferedReader reader;
static StringTokenizer tokenizer;
/** call this method to initialize reader for InputStream */
static void init(InputStream input) {
reader = new BufferedReader(new InputStreamReader(input));
tokenizer = new StringTokenizer("");
}
/** get next word */
static String next() throws IOException {
while (!tokenizer.hasMoreTokens())
//TODO add check for eof if necessary
tokenizer = new StringTokenizer(reader.readLine());
return tokenizer.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt(next());
}
}