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

PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)的更多相关文章

  1. PAT 1018 锤子剪刀布(20)

    1018 锤子剪刀布 (20)(20 分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方 ...

  2. PAT乙级 1018. 锤子剪刀布 (20)

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  3. PAT 乙级 1018 锤子剪刀布 (20) C++版

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  4. 【PAT】1018 锤子剪刀布 (20)(20 分)

    1018 锤子剪刀布 (20)(20 分) 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算 ...

  5. PAT Basic 1018 锤子剪刀布 (20 分)

    大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第 1 行给出正整数 ...

  6. PAT (Basic Level) Practice 1018 锤子剪刀布 分数 20

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...

  7. PAT-乙级-1018. 锤子剪刀布 (20)

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  8. B1018 锤子剪刀布 (20分)

    B1018 锤子剪刀布 (20分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势. 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. ...

  9. PAT (Basic Level) Practise (中文)- 1018. 锤子剪刀布 (20)

    http://www.patest.cn/contests/pat-b-practise/1018 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统 ...

随机推荐

  1. ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型

    在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...

  2. IDEA导航光标回退和前进快捷键失效

    工作中突然发现IDEA里的Ctrl+Alt+Left/Right失效了,即导航光标的回退和前进,影响看代码的效率. 用Windows Hotkey Explorer查看,发现是被igfxHK.exe进 ...

  3. 数据库Sequence创建与使用

    最近几天使用Oracle的sequence序列号,发现对如何创建.修改.使用存在很多迷茫点,在上网寻找答案后,根据各路大神的总结,汇总下对自己的学习成果: 在Oracle中sequence就是序号,每 ...

  4. redis安装与介绍

    安装 一般推荐次新版的最后一个发行版.https://redis.io/download 先安装gcc, yum install gcc tar xzf redis-3.2.3.tar.gz cd r ...

  5. BitmapFactory之Options

    package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...

  6. MySQL批量导入Excel数据

    MySQL批量导入Excel数据 1.确定需要导入数据的表名称以及字段,然后在新建的Excel表中,按照表字段正确排序:(注:(Excel文件的名称最好和数据库的名称一致,sheet表的名字最好和表名 ...

  7. osg 在场景中绘制坐标轴(xyz)

    //x y z font_size osg::Geode* makeCoordinate(float a_x,float a_y,float a_z,float font_size) { osg::r ...

  8. 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_03-新增课程-课程分类查询

    2 新增课程 2.1 需求分析 用户操作流程如下: 1.用户进入“我的课程”页面,点击“新增课程”,进入新增课程页面 2.填写课程信息,选择课程分类.课程等级.学习模式等. 3.信息填写完毕,点击“提 ...

  9. Java Web接入支付宝扫码付款API(使用SDK证书配置properties )

    一.支付宝当面付功能Demo 官方文档https://docs.open.alipay.com/194/106078/ ps:因为沙箱环境一经配置了证书公钥则无法重置 第一步下载项目SKD&D ...

  10. npm教程、脚手架

    使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的 ...