使用AI进行翻译,未经个人查证(仅供参考)
模拟是一种计算机科学的重要应用领域,涉及开发计算机模型来洞察现实世界的事件。模拟的类型多种多样,包括(但不限于)离散事件模拟和时钟驱动模拟。模拟通常需要通过近似观察行为以开发出切实可行的方法。
本题涉及对一个简化版弹球机的模拟。在弹球机中,钢球在一个平面上滚动,撞击各种物体(如弹簧板)并积累分数,直到钢球从平面上“消失”。
你的任务是编写一个程序,模拟一个理想化的弹球机。此弹球机的平面是一个带有障碍物(弹簧板和墙壁)的二维网格。平面被建模为一个 m×n 的网格,其坐标原点位于左下角。每个弹簧板占据一个网格点,网格边缘的格子是墙壁。钢球以初始位置、方向和寿命依次发射到网格中。
在本模拟中,所有位置均为整数,钢球的方向为以下四种之一:上、下、左或右。钢球在网格中弹跳,撞击弹簧板(累积分数)和墙壁(不增加分数)。撞击某个弹簧板时的得分为该弹簧板的分值。钢球的速度为每时间步移动一个网格单位。当钢球将移动到某个弹簧板或墙壁所在的网格点时,即算作“撞击”了该障碍物。每次撞击都会导致钢球“反弹”,即顺时针旋转90度,但不会进入障碍物所在的网格点,其位置不变(只有方向因反弹而改变)。注意,沿着墙壁滑动并不算作“撞击”墙壁。
钢球的寿命表示钢球在从平面上消失之前可以存活的时间单位数。钢球的每次网格移动都会消耗1单位的寿命,撞击障碍物也会消耗一定单位的寿命。撞击某个弹簧板或墙壁所消耗的寿命等于该障碍物的代价。当钢球撞击弹簧板时,只要其寿命仍为正数,就会获得该弹簧板的全部分值。注意,寿命为1的钢球将在下一次移动中“死亡”,因此无法在此最后移动中获得撞击弹簧板的分数。一旦寿命为非正数(≤0),钢球即从平面上消失,游戏继续处理下一个钢球。
你的程序应模拟一次弹球游戏。输入包含若干行,描述游戏的参数:
对于输入中的每个钢球,按输入顺序输出一个整数,表示该钢球累积的分数,每行输出一个整数。最后输出一个整数,表示所有钢球累积分数的总和。
4 4
0
2
2 2 1 0
3 3 1 0
2 3 1 1
2 3 1 2
2 3 1 3
2 3 1 4
2 3 1 5
0
0
1
2
2
5