#题解
题目大意 n个操作 基础值r 定义五种操作
add将r增加v
beq看r是否等于v如果等于则跳转到第k条指令
bne看r是否不等于v如果不等于则跳转到第k条指令
blt看r是否严格小于v如果小于则跳转到第k条指令
bgt看r是否严格大于v如果大于则跳转到第k条指令
指令编号从1到n
模拟一下 如果执行同一条指令前r的值出现过则出现死循环输出No 否则循环超出n输出Yes
#AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e4 + 10;
int o[MAXN], v[MAXN], k[MAXN];
bool vis[MAXN][260];
char s[100];
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
int T;
cin >> T;
while (T--)
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%s%d", s, &v[i]);
if (strcmp(s, "add") == 0)
o[i] = 1;
else
{
scanf("%d", &k[i]);
if (strcmp(s, "beq") == 0)
o[i] = 2;
else if (strcmp(s, "bne") == 0)
o[i] = 3;
else if (strcmp(s, "blt") == 0)
o[i] = 4;
else if (strcmp(s, "bgt") == 0)
o[i] = 5;
}
memset(vis[i], 0, sizeof(vis[i]));
}
int p = 1, r = 0;
while (p <= n)
{
if (vis[p][r])
break;
vis[p][r] = true;
if (o[p] == 1)
r = (r + v[p]) % 256, p++;
else if (o[p] == 2)
{
if (r == v[p])
p = k[p];
else
p++;
}
else if (o[p] == 3)
{
if (r != v[p])
p = k[p];
else
p++;
}
else if (o[p] == 4)
{
if (r < v[p])
p = k[p];
else
p++;
}
else if (o[p] == 5)
{
if (r > v[p])
p = k[p];
else
p++;
}
}
if (p > n)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}