题意:
按照题意模拟,如果能进行到n+1步,则yes,否则如果无限循环,则no;
思路:
记录一下每一步对应的状态,如果重复访问,则重复。
一定要用bool类型!!!
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 3;
int t,n;
int v[maxn];
int k[maxn];
char s[maxn][4];
bool vis[maxn][256];
void init()
{
memset(v,-1,sizeof v);
memset(k,-1,sizeof k);
memset(vis,0,sizeof vis);
memset(s,0,sizeof s);
}
int main()
{
ios::sync_with_stdio(0);
cin>>t;
while(t--)
{
init();
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>s[i];
if(strcmp(s[i],"add") == 0 )
{
cin>>v[i];
}
else
{
cin>> v[i] >> k[i];
}
}
int flag = 0;
int rg = 0;
int step = 1;
while(1)
{
if(strcmp(s[step],"add") == 0)
{
rg = (rg + v[step]) % 256;
step++;
if(step > n )
{
flag = 1;
break;
}
if(vis[step][rg] == 0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
else if(strcmp(s[step],"beq") == 0)
{
if(v[step] == rg)
{
step = k[step];
if(vis[step][rg] ==0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
else
{
step++;
if(step == n + 1)
{
flag = 1;
break;
}
if(vis[step][rg] == 0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
}
else if(strcmp(s[step],"bne") == 0)
{
if(v[step] != rg)
{
step = k[step];
if(vis[step][rg] ==0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
else
{
step++;
if(step == n + 1)
{
flag = 1;
break;
}
if(vis[step][rg] ==0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
}
else if(strcmp(s[step],"blt") == 0)
{
if(v[step] > rg)
{
step = k[step];
if(vis[step][rg] == 0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
else
{
step++;
if(step == n + 1)
{
flag = 1;
break;
}
if(vis[step][rg] ==0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
}
else if(strcmp(s[step],"bgt") == 0)
{
if(v[step] < rg)
{
step = k[step];
if(vis[step][rg] == 0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
else
{
step++;
if(step == n + 1)
{
flag = 1;
break;
}
if(vis[step][rg] ==0)
{
vis[step][rg] = 1;
}
else
{
flag = 0;
break;
}
}
}
}
if(flag)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}