[C++][APCS] 棒球游戏

题目出自 APCS 网站 > 历次试题 > 2016-10-29_实作题 > 第四题 棒球游戏
连结

解答仅供参考

解答:

#include <stdio.h>#include <stdlib.h>#include <string>using namespace std;#define SIZE 9int main(void){    int a[SIZE];    string input[SIZE][5];    char temp[3];    int b;    //读取打击结果    for (int i = 0; i < SIZE; i++)    {        scanf("%d", &a[i]);        for (int j = 0; j < a[i]; j++)        {            scanf("%s", temp);            input[i][j] = temp;        }    }    scanf("%d", &b);    //计算分数    int num = 0;       //打击结果转换后的值    int point = 0;     //分数    int out = 0;       //当局出局数    int out_sum = 0;   //累积出局数    int base[4] = {0}; //跑垒状态,0垒上无人、1垒上有人,阵列索引分别对应,0:本垒, 1:一垒, 2:二垒, 3:三垒    auto getNum = [&](string &point) {        if (point == "1B")            return 1;        else if (point == "2B")            return 2;        else if (point == "3B")            return 3;        else if (point == "HR")            return 4;        return 0;    };    bool isOver = false;    int index = 0;    while (true)    {        for (int i = 0; i < SIZE; i++)        {            //超过最后一笔资料            if (index > a[i])            {                isOver = true;                break;            }            //将打击结果转换为数字            num = getNum(input[i][index]);            //出局            if (num == 0)            {                out_sum++;                out++;            }            //安打            else            {                base[0] = 1; //将打击者放在本垒                for (int x = 3; x >= 0; x--)                {                    //如果垒上有人                    if (base[x] == 1)                    {                        //回到本垒                        if (x + num >= 4)                        {                            point++;                        }                        //未回到本垒                        else                        {                            base[x + num] = 1;                        }                        base[x] = 0;                    }                }            }            //出局数达到结束条件            if (out_sum == b)            {                isOver = true;                break;            }            //达到三个出局数,清空跑垒状态            if (out == 3)            {                out = 0;                base[0] = base[1] = base[2] = base[3] = 0;            }        }        if (isOver)        {            break;        }        index++;    }    //印出结果    printf("%d", point);    system("pause");    return 0;}

输入:

5 1B 1B FO GO 1B5 1B 2B FO FO SO4 SO HR SO 1B4 FO FO FO HR4 1B 1B 1B 1B4 GO GO 3B GO4 1B GO GO SO4 SO GO 2B 2B4 3B GO GO FO3
0

输出:

5 1B 1B FO GO 1B5 1B 2B FO FO SO4 SO HR SO 1B4 FO FO FO HR4 1B 1B 1B 1B4 GO GO 3B GO4 1B GO GO SO4 SO GO 2B 2B4 3B GO GO FO6
5

说明:
以往写C++处理字串都是使用C传统的字元阵列,
这次想来练习一下 C++ 好用的 string 物件,
读取字串因为还是使用 scanf 函数,所以另外宣告一个字元阵列来暂存读进来的字串,
因为打击结果都是长度为2的字串,所以这里我宣告了一个长度为3的阵列,阵列的最后一位用来储存字串的结尾符号 '\0'

接下来就是将暂存的字串写入 string 阵列内,因为 string 有 operator = 所以可以直接将 C Style 的字元阵列赋值给 string,这个赋值会将暂存阵列内的字元複製到 string 的记忆体空间中。

接下来我写了一个 getNum 函数,用来将打击结果的字串转换为数字。
1 -> 1垒打
2 -> 2垒打
3 -> 3垒打
4 -> 全垒打
0 -> 出局

再来讲一下安打的地方,会先从 三垒 > 二垒 > 一垒 > 本垒,依次检查每位跑垒者是否回到本垒,如果回到本垒就将分数加一,然后清除垒包上跑垒前的位置,如果没有回到本垒,就将跑垒员移动到跑垒后的垒包上,并清除跑垒前的位置。

接着就是简单的计分逻辑,就不再多做说明。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章