• 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. 如果有疑问欢迎评论留言,尽量解答。

  • 相关阅读:
    简单的模板解析函数
    HTML通过事件传递参数到js 二 event
    HTML通过事件传递参数到js一
    通过this获取当前点击选项相关数据
    LeetCode 20. 有效的括号(Valid Parentheses)
    LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
    LeetCode 14. 最长公共前缀(Longest Common Prefix)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22
    LeetCode 665. 非递减数列(Non-decreasing Array)
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060778.html
Copyright © 2020-2023  润新知