本题就是一个模拟 用bool数组判重
如果在执行代码的过程中 再次回到标记处 说明出现了循环结构
此时死循环出现 直接break 输出no
至于为啥不在if后面直接mark
那是因为add操作一次后再进入循环
r的值是暂未改变 直接被判断为死循环 break
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#define maxn 10005
#define clr(a,b) memset(a,b,sizeof(a));
using namespace std;
struct node
{
int id,v,k;
}que[maxn];
bool visit[maxn][257];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
clr(visit,0)
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
string str;
int v,k;
cin>>str;
if(str=="add")
{
scanf("%d",&v);
que[i].id=1;
que[i].v=v;
}
if(str=="beq")
{
scanf("%d %d",&v,&k);
que[i].id=2;
que[i].v=v;
que[i].k=k;
}
if(str=="bne")
{
scanf("%d %d",&v,&k);
que[i].id=3;
que[i].v=v;
que[i].k=k;
}
if(str=="blt")
{
scanf("%d %d",&v,&k);
que[i].id=4;
que[i].v=v;
que[i].k=k;
}
if(str=="bgt")
{
scanf("%d %d",&v,&k);
que[i].id=5;
que[i].v=v;
que[i].k=k;
}
}
int loc=1,r=0,flag=1;
while(1)
{
if(visit[loc][r])
{
flag=0;
break;
}
else visit[loc][r]=1;
if(loc==n+1)
break;
if(que[loc].id==1)
{
r=(r+que[loc].v)%256;
loc++;
continue;
}
if(que[loc].id==2)
{
if(que[loc].v==r) loc=que[loc].k;
else loc++;
continue;
}
if(que[loc].id==3)
{
if(que[loc].v!=r) loc=que[loc].k;
else loc++;
continue;
}
if(que[loc].id==4)
{
if(que[loc].v>r) loc=que[loc].k;
else loc++;
continue;
}
if(que[loc].id==5)
{
if(que[loc].v<r) loc=que[loc].k;
else loc++;
continue;
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}