1 条题解

  • 0
    @ 2025-11-4 9:34:46

    题解

    问题分析

    本题需要模拟 SH 语言程序的执行过程,核心是按顺序解析并执行三种命令(ADD、GOTO、PRINT),维护 26 个寄存器的状态,处理条件跳转逻辑,最终输出 PRINT 命令的结果。

    关键思路

    1. 寄存器初始化:读取第一行的 26 个初始值,存储到以字母(A-Z)为键的字典中。
    2. 命令解析与执行
      • 逐行读取命令,按命令类型(ADD、GOTO、PRINT)分类处理。
      • ADD 命令:解析出两个寄存器,将第二个寄存器的值加到第一个上。
      • GOTO 命令:解析寄存器、立即数和目标行号,若寄存器值小于立即数则跳转到目标行,否则继续执行下一行。
      • PRINT 命令:输出指定寄存器的值,程序结束。
    3. 流程控制:用循环按行号顺序执行命令,通过标记和条件判断处理 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
    上传者