halting_problem zoj 2018 ACM-ICPC qingdao

本文介绍了一种使用bool数组判断代码中是否存在循环结构的方法。通过跟踪代码执行路径,一旦发现重复的执行点则判断存在死循环,立即终止并输出结果。这种方法适用于简单的指令集,如add、beq、bne等,通过解析输入的指令序列,构建执行流程图,利用标记机制检查循环。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值