1 条题解
-
0
题解
问题分析
本题需要模拟 SH 语言程序的执行过程,核心是按顺序解析并执行三种命令(ADD、GOTO、PRINT),维护 26 个寄存器的状态,处理条件跳转逻辑,最终输出 PRINT 命令的结果。
关键思路
- 寄存器初始化:读取第一行的 26 个初始值,存储到以字母(A-Z)为键的字典中。
- 命令解析与执行:
- 逐行读取命令,按命令类型(ADD、GOTO、PRINT)分类处理。
- ADD 命令:解析出两个寄存器,将第二个寄存器的值加到第一个上。
- GOTO 命令:解析寄存器、立即数和目标行号,若寄存器值小于立即数则跳转到目标行,否则继续执行下一行。
- PRINT 命令:输出指定寄存器的值,程序结束。
- 流程控制:用循环按行号顺序执行命令,通过标记和条件判断处理 GOTO 跳转,直到执行到 PRINT 命令。
代码实现
def main(): import sys lines = sys.stdin.read().splitlines() # 初始化寄存器:A-Z对应索引0-25 regs = list(map(int, lines[0].split())) reg_dict = {chr(ord('A') + i): regs[i] for i in range(26)} # 命令列表(从第2行开始) commands = lines[1:] n = len(commands) current_line = 0 # 行号从0开始(对应原第2行) goto_line = -1 # 记录GOTO的目标行(若有) while current_line < n: cmd = commands[current_line].strip() if goto_line != -1: # 处理GOTO跳转 current_line = goto_line goto_line = -1 continue if cmd.startswith('ADD'): # 解析ADD命令:ADD_R1_R2 parts = cmd.split('_') r1 = parts[1] r2 = parts[2] reg_dict[r1] += reg_dict[r2] current_line += 1 elif cmd.startswith('IF'): # 解析GOTO命令:IF_R_<I1_GOTO_LINE_I2 parts = cmd.split() # 提取寄存器R r_part = parts[0].split('_')[1] r = r_part # 提取立即数I1 i1 = int(parts[1].split('_')[0]) # 提取目标行I2 i2 = int(parts[2].split('_')[1]) # 条件判断:若R的值 < I1,则跳转到第i2行(原行号i2-2,因为命令从第2行开始) if reg_dict[r] < i1: goto_line = i2 - 2 # 转换为当前命令列表的索引(从0开始) current_line += 1 elif cmd.startswith('PRINT'): # 解析PRINT命令:PRINT_R r = cmd.split('_')[1] print(reg_dict[r]) break if __name__ == "__main__": main()复杂度分析
- 时间复杂度:程序逐行执行命令,最多遍历所有命令一次,时间复杂度为 ( O(n) )(( n ) 为命令行数)。
- 空间复杂度:维护 26 个寄存器和命令列表,空间复杂度为 ( O(1) )(寄存器数量固定)。
该方法准确模拟了 SH 语言的执行逻辑,可处理所有合法输入并输出正确结果。
- 1
信息
- ID
- 4936
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者