当前位置: 首页 > news >正文

PAT乙级( 1018 锤子剪刀布)C语言超详细解析

文章目录

  • 1018 锤子剪刀布

1018 锤子剪刀布

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

在这里插入图片描述

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 1 行给出正整数 N(≤10 的5次方),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

输出格式:

输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1 个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

5 3 2
2 3 5
B B

代码示例

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

// 该函数用于找出获胜次数最多的手势对应的字符
// 输入参数 x 是一个长度为 3 的整型数组,分别记录 'B'、'C'、'J' 三种手势的获胜次数
// 返回值为获胜次数最多的手势对应的字符
char findmax(int x[]) {
    int max1 = 0;  // 用于记录当前最大的获胜次数,初始化为 0
    int t1;  // 用于记录最大获胜次数对应的手势在数组中的索引

    // 遍历数组 x,找出最大的获胜次数以及对应的索引
    for (int i = 0; i < 3; i++) {
        if (x[i] > max1) {
            max1 = x[i];  // 更新最大获胜次数
            t1 = i;  // 记录最大获胜次数对应的索引
        }
    }

    // 根据索引 t1 返回对应的手势字符
    if (t1 == 0) {
        return 'B';  // 索引 0 对应 'B' 手势
    } else if (t1 == 1) {
        return 'C';  // 索引 1 对应 'C' 手势
    } else {
        return 'J';  // 索引 2 对应 'J' 手势
    }
}

int main() {
    int n;  // 用于存储双方交锋的总次数
    scanf("%d", &n);  // 从标准输入读取交锋次数

    char a, b;  // 分别用于存储甲方和乙方每次交锋给出的手势

    // 用于记录甲方和乙方的胜、平、负次数
    int jia_win = 0;  // 甲方获胜次数
    int yi_win = 0;   // 乙方获胜次数
    int ping = 0;     // 平局次数
    int jia_lose = 0; // 甲方失败次数
    int yi_lose = 0;  // 乙方失败次数

    // 用于记录甲方和乙方每种手势的获胜次数
    // x[0] 记录甲方 'B' 手势的获胜次数,x[1] 记录甲方 'C' 手势的获胜次数,x[2] 记录甲方 'J' 手势的获胜次数
    // y[0] 记录乙方 'B' 手势的获胜次数,y[1] 记录乙方 'C' 手势的获胜次数,y[2] 记录乙方 'J' 手势的获胜次数
    int x[3] = {0};
    int y[3] = {0};

    // 循环处理 n 次交锋记录
    for (int i = 0; i < n; i++) {
        getchar();  // 消耗掉上一次输入(scanf("%d", &n))后的换行符

        // 从标准输入读取甲方和乙方本次交锋给出的手势
        scanf("%c %c", &a, &b);

        // 判断甲方是否获胜
        if ((a == 'B' && b == 'C') || (a == 'J' && b == 'B') || (a == 'C' && b == 'J')) {
            jia_win++;  // 甲方获胜次数加 1

            // 根据甲方获胜的手势更新 x 数组中对应手势的获胜次数
            if (a == 'B') {
                x[0]++;  // 'B' 手势获胜次数加 1
            } else if (a == 'C') {
                x[1]++;  // 'C' 手势获胜次数加 1
            } else {
                x[2]++;  // 'J' 手势获胜次数加 1
            }

            yi_lose++;  // 乙方失败次数加 1
        } 
        // 判断是否平局
        else if ((a == 'B' && b == 'B') || (a == 'J' && b == 'J') || (a == 'C' && b == 'C')) {
            ping++;  // 平局次数加 1
        } 
        // 否则乙方获胜
        else {
            jia_lose++;  // 甲方失败次数加 1

            // 根据乙方获胜的手势更新 y 数组中对应手势的获胜次数
            if (b == 'B') {
                y[0]++;  // 'B' 手势获胜次数加 1
            } else if (b == 'C') {
                y[1]++;  // 'C' 手势获胜次数加 1
            } else {
                y[2]++;  // 'J' 手势获胜次数加 1
            }

            yi_win++;  // 乙方获胜次数加 1
        }
    }

    // 调用 findmax 函数找出甲方和乙方获胜次数最多的手势对应的字符
    char m = findmax(x);  // 甲方获胜次数最多的手势字符
    char m1 = findmax(y); // 乙方获胜次数最多的手势字符

    // 输出甲方的胜、平、负次数
    printf("%d %d %d\n", jia_win, ping, jia_lose);
    // 输出乙方的胜、平、负次数
    printf("%d %d %d\n", yi_win, ping, yi_lose);
    // 输出甲方和乙方获胜次数最多的手势字符
    printf("%c %c", m, m1);

    return 0;
}

相关文章:

  • CV -- YOLOv8 图像分割(GPU环境)
  • 【再谈设计模式】迭代器模式~遍历集合元素的利器
  • 数据链路层分析
  • PHP 安全与加密:守护 Web 应用的基石
  • 【C++】类与对象全面剖析(尾卷)(构造深化、类型转换、static成员特性及内部类与匿名对象)
  • Linksys WRT54G路由器溢出漏洞分析–运行环境修复
  • 业务流程中的基准测试 (Benchmarking in Business Processes)介绍
  • 树(数据结构·)
  • 【数据结构初阶第十二节】设计循环队列
  • 在WPF中实现窗口拖拽功能:打造自定义交互体验
  • 管道的学习
  • 当一个后端下载了一个VUE开源项目,怎么开始着手玩一下
  • 【DeepSeek服务器部署全攻略】Linux服务器部署DeepSeek R1模型、实现API调用、搭建Web页面以及专属知识库
  • git 操作 已经 commit 但是没有 push 怎么办
  • 国产编辑器EverEdit - 独门暗器:自动监视剪贴板内容
  • 嵌入式0xDEADBEEF
  • 用python进行二分法查找(python实例三十)
  • 【算法通关村 Day5】Hash和队列的经典问题
  • 敏捷开发06:用户故事估算方法介绍
  • DDD领域驱动开发第2讲:领域驱动开发在货代订单业务的实践
  • 对谈|“大礼议”:嘉靖皇帝的礼法困境与权力博弈
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛暨七猫第六届百万奖金现实题材征文大赛征稿启事
  • 淄博一酒店房间内被曝发现摄像头,当地警方已立案调查
  • 埃尔多安:愿在土耳其促成俄乌领导人会晤
  • 男子恶意遗弃幼子获刑,最高法发布涉未成年人家庭保护典型案例
  • 中国科学院院士、我国航天液体火箭技术专家朱森元逝世