halting_problem zoj 2018 ACM-ICPC qingdao

本题就是一个模拟 用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");
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41544329/article/details/83374235