PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)

    xiaoxiao2022-07-06  207

    题目链接:1018 锤子剪刀布
    分析
    用一个二维数组保存两人所有回合的手势甲乙的胜,平,负的次数刚好相反,用3个变量表示就可以手势单独保存在signs[3]中,注意顺序。题目原文:如果解不唯一,则输出按字母序最小的解。注意input()中的getchar()不能省略
    C
    /** * Score 20 * Run Time 25ms * @author wowpH * @version 4.2 */ #include<stdio.h> #include<stdlib.h> int n; //交锋次数 char** sign; //甲乙的手势,sign[n][2] //甲胜的次数,甲平的次数,甲负的次数 int winJia, levelJia, loseJia; // B C J // 甲 // 乙 int numSignWin[2][3] = { 0 }; //出手势胜的次数 //手势 char signs[3] = { 'B','C','J' }; void input() { scanf("%d", &n); sign = (char**)malloc(n * sizeof(char*)); for (int i = 0; i < n; i++) { sign[i] = (char*)malloc(2 * sizeof(char)); //申请内存 } for (int i = 0; i < n; i++) { getchar(); //获取换行符 scanf("%c %c", &sign[i][0], &sign[i][1]); //第i回合甲乙的手势 } } void judge(char jia, char yi) { if (jia == yi) { //平 levelJia++; } else if (jia == signs[0] && yi == signs[1]) { //甲 布 胜 winJia++; //甲胜,次数加1 numSignWin[0][0]++; //对照表格 } else if (jia == signs[0] && yi == signs[2]) { //乙 剪刀 胜 loseJia++; numSignWin[1][2]++; } else if (jia == signs[1] && yi == signs[0]) { //乙 布 胜 loseJia++; numSignWin[1][0]++; } else if (jia == signs[1] && yi == signs[2]) { //甲 石头 胜 winJia++; numSignWin[0][1]++; } else if (jia == signs[2] && yi == signs[0]) { //甲 剪刀 胜 winJia++; numSignWin[0][2]++; } else if (jia == signs[2] && yi == signs[1]) { //乙 石头 胜 loseJia++; numSignWin[1][1]++; } } //获取who赢的最多的手势在signs中的下标 int maxIndex(int who) { int max = numSignWin[who][0]; int index = 0; for (int i = 0; i < 3; i++) { if (max < numSignWin[who][i]) { max = numSignWin[who][i]; index = i; } } return index; } void output() { printf("%d %d %d\n", winJia, levelJia, loseJia); printf("%d %d %d\n", loseJia, levelJia, winJia); printf("%c ", signs[maxIndex(0)]); //输出甲赢的最多的手势 printf("%c\n", signs[maxIndex(1)]); //输出乙赢的最多的手势 } int main() { input(); //输入 winJia = levelJia = loseJia = 0; for (int i = 0; i < n; i++) { judge(sign[i][0], sign[i][1]); //判断第i回合胜负 } output();//输出 return 0; }
    Java
    /** * Score 18 * Run Time 117ms * @author wowpH * @version 1.0 */ import java.util.Scanner; public class Main { private int n;// 交锋次数 // 甲和乙的手势 private char[][] sign; // 甲胜的次数,甲平的次数,甲负的次数 private int winJia, levelJia, loseJia; // 布 石头 剪刀 //甲 private int[] numSignWinJia = new int[3]; // 布 石头 剪刀 //乙 private int[] numSignWinYi = new int[3]; private char[] signs = { 'B', 'C', 'J' }; public Main() { input(); for (int i = 0; i < n; i++) { judge(sign[i][0], sign[i][1]); } output(); } private void input() { // 输入数据 Scanner sc = new Scanner(System.in); n = sc.nextInt(); sign = new char[n][2]; for (int i = 0; i < n; i++) { sign[i][0] = sc.next().charAt(0); sign[i][1] = sc.next().charAt(0); } sc.close(); } private void judge(char jia, char yi) { if (jia == yi) {// 平 levelJia++; } else if ('C' == jia && 'J' == yi) {// 甲出石头胜 numSignWinJia[1]++; winJia++; } else if ('C' == jia && 'B' == yi) {// 乙出布胜 numSignWinYi[0]++; loseJia++; } else if ('J' == jia && 'C' == yi) {// 乙出石头胜 numSignWinYi[1]++; loseJia++; } else if ('J' == jia && 'B' == yi) {// 甲出剪刀胜 numSignWinJia[2]++; winJia++; } else if ('B' == jia && 'C' == yi) {// 甲出布胜 numSignWinJia[0]++; winJia++; } else if ('B' == jia && 'J' == yi) {// 乙出剪刀胜 numSignWinYi[2]++; loseJia++; } } private void output() { System.out.println(winJia + " " + levelJia + " " + loseJia); System.out.println(loseJia + " " + levelJia + " " + winJia); System.out.print(signs[maxIndex(numSignWinJia)]); System.out.print(" "); System.out.println(signs[maxIndex(numSignWinYi)]); } private int maxIndex(int[] num) { int index = 0; int max = num[0]; for (int i = 1; i < 3; i++) { if (max < num[i]) { max = num[i]; index = i; } } return index; } public static void main(String[] args) { new Main(); } }

    版权声明:

    转载请于首页注明链接形式的PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)——wowpH;代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);如果有疑问欢迎评论留言,尽量解答。
    最新回复(0)