1. 程式人生 > >halting_problem zoj 2018 ACM-ICPC qingdao

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");
	}
}