SP89 HANGLET - Hang or not to hang
题目描述
小汤姆正在学习编程,他已经写了一些程序,但不敢运行它们,因为不知道这些程序是否会停止。请你写一个程序来帮助他。这个任务并不简单,因为汤姆写的程序可能不是确定性的。对于给定的程序,你的任务是判断该程序是否能够停止,如果可以,计算它停止所需的最短时间。
汤姆使用的计算机有 32 个 1 位寄存器,程序由 $n$ 条指令构成。寄存器的编号范围是 0 到 31,指令的编号范围是 0 到 $n-1$。
在下文中,`MEM[a]` 表示第 $a$ 个寄存器的值,$0 \le a, b < 32$,$0 \le x < n$,$0 \le c \le 1$。
指令集具体如下:
```
指令 含义
AND a b MEM[a] 的值变为 MEM[a] 和 MEM[b] 的按位与
OR a b MEM[a] 的值变为 MEM[a] 和 MEM[b] 的按位或
XOR a b MEM[a] 的值变为 MEM[a] 和 MEM[b] 的按位异或
NOT a MEM[a] 的值变为 MEM[a] 的按位取反
MOV a b 把 MEM[b] 的值赋给 MEM[a]
SET a c 把 c 赋值给 MEM[a]
RANDOM a MEM[a] 赋值为随机的 0 或 1
JMP x 跳转到第 x 条指令
JZ x a 如果 MEM[a] 为 0,跳转到第 x 条指令
STOP 停止程序
```
输入格式
输入以一个整数 $t$ 开始,表示测试用例的数量。接下来是 $t$ 组测试用例。
每组测试用例的第一行包含一个整数 $n$($1 \le n \le 16$),表示程序中指令的数量。接下来的 $n$ 行,每行包含一条指令,格式如上。可以假设每条指令中只有连续标记间包含单个空格。
输出格式
对于每个测试用例,输出一行,内容为程序的最短可能运行时间(以处理器周期计)。如果程序无法停止,输出 `HANGS`。
**本翻译由 AI 自动生成**