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


    题目链接: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
    ", winJia, levelJia, loseJia);
    	printf("%d %d %d
    ", loseJia, levelJia, winJia);
    	printf("%c ", signs[maxIndex(0)]);	//输出甲赢的最多的手势
    	printf("%c
    ", 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();
    	}
    }
    

    版权声明:

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

  • 相关阅读:
    Intellij Idea 设置之方法快速显示
    HTML转码码
    MIT自然语言处理第五讲:最大熵和对数线性模型(第一部分)
    MIT自然语言处理第五讲:最大熵和对数线性模型(第二部分)
    MIT自然语言处理第五讲:最大熵和对数线性模型(第四部分)
    MIT自然语言处理第五讲:最大熵和对数线性模型(第三部分)
    文本分类专题(ultimate 版)绝对是目前最全的C++版开源文本分类代码和最令人耳目一新的实验解释
    intellij idea教程
    [转] 一个大数相乘的C/C++实现
    5个海盗分金币的问题
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060778.html
Copyright © 2020-2023  润新知