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\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();
	}
}

版权声明:

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

posted @ 2019-05-22 19:24  wowpH  阅读(586)  评论(0编辑  收藏  举报