1 条题解

  • 0
    @ 2025-5-21 11:04:15

    题目解析

    题意分析

    这道题目模拟了线性柏青哥机器中球的运动轨迹,要求计算球最终掉入洞或从机器两端掉落的概率。机器由四种字符组成:

    1. 字符类型

      • 洞(..):球直接掉落通过
      • 地板(_):球立即停止
      • 墙(|):球向左或向右滚动,概率各50%50\%
      • 山(/\):球根据方向滚动(//向左,\向右)
    2. 运动规则

      • 球从随机位置投下,所有起始位置概率均等
      • 球碰到地板停止
      • 球碰到山或墙会滚动,直到掉入洞、从端点掉落或碰到障碍物停止
    3. 输出要求

      • 计算所有可能起始位置的平均掉落概率
      • 输出百分比,截断小数部分

    解题思路

    1. 模拟运动轨迹

      • 对每个起始位置,模拟球的运动过程
      • 根据字符类型决定球的运动方向和行为
    2. 概率计算

      • 墙(|)有50%50\%向左或向右的概率
      • 其他字符的行为确定
      • 统计所有起始位置的掉落概率,求平均值
    3. 边界处理

      • 球从端点掉落视为成功
      • 球碰到地板或无法滚动的障碍物视为失败

    #include <iostream>
    #include <cstdio>    // 用于scanf和printf
    #include <cstring>   // 用于strlen
    using namespace std;
    
    char a[128];
    
    int left(int pos)
    {
        for(int i = pos - 1; i >= 0; --i)    
            if(a[i] == '.')
                return 1;
            else if(a[i] == '|' || a[i] == '/' || a[i] == '\\')
                return 0;
        return 1;
    }
    
    int right(int pos)
    {
        for(int i = pos + 1; a[i] != '\0'; ++i)    
            if(a[i] == '.')
                return 1;
            else if(a[i] == '|' || a[i] == '/' || a[i] == '\\')
                return 0;
        return 1;
    }
    
    int main()
    {
        while(scanf("%s", a) == 1) {
            if(a[0] == '#')
                break;
            int i, sum = 0, len = strlen(a);
            for(i = 0; i < len; ++i)
                if(a[i] == '.')
                    sum += 100;
                else if(a[i] == '_')
                    sum += 0;
                else if(a[i] == '/') {
                    if(left(i) == 1)
                        sum += 100;
                } else if(a[i] == '\\') {
                    if(right(i))
                        sum += 100;
                } else if(a[i] == '|') {
                    if(right(i))
                        sum += 50;
                    if(left(i))
                        sum += 50;
                }
            printf("%d\n", sum / len);
        }
        return 0;    
    }
    
    • 1

    信息

    ID
    2096
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    1
    上传者