1 条题解
-
0
题目解析
题意分析
这道题目模拟了线性柏青哥机器中球的运动轨迹,要求计算球最终掉入洞或从机器两端掉落的概率。机器由四种字符组成:
-
字符类型:
- 洞():球直接掉落通过
- 地板(_):球立即停止
- 墙():球向左或向右滚动,概率各
- 山(/\):球根据方向滚动(向左,\向右)
-
运动规则:
- 球从随机位置投下,所有起始位置概率均等
- 球碰到地板停止
- 球碰到山或墙会滚动,直到掉入洞、从端点掉落或碰到障碍物停止
-
输出要求:
- 计算所有可能起始位置的平均掉落概率
- 输出百分比,截断小数部分
解题思路
-
模拟运动轨迹:
- 对每个起始位置,模拟球的运动过程
- 根据字符类型决定球的运动方向和行为
-
概率计算:
- 墙()有向左或向右的概率
- 其他字符的行为确定
- 统计所有起始位置的掉落概率,求平均值
-
边界处理:
- 球从端点掉落视为成功
- 球碰到地板或无法滚动的障碍物视为失败
#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
- 上传者