The 2018 ACM-ICPC Asia Qingdao Regional Contest C Halting Problem

#题解
题目大意 n个操作 基础值r 定义五种操作
add将r增加v
beq看r是否等于v如果等于则跳转到第k条指令
bne看r是否不等于v如果不等于则跳转到第k条指令
blt看r是否严格小于v如果小于则跳转到第k条指令
bgt看r是否严格大于v如果大于则跳转到第k条指令
指令编号从1到n

模拟一下 如果执行同一条指令前r的值出现过则出现死循环输出No 否则循环超出n输出Yes
#AC代码

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 1e4 + 10;
int o[MAXN], v[MAXN], k[MAXN];
bool vis[MAXN][260];
char s[100];

int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	int T;
	cin >> T;
	while (T--)
	{
		int n;
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
		{
			scanf("%s%d", s, &v[i]);
			if (strcmp(s, "add") == 0)
				o[i] = 1;
			else
			{
				scanf("%d", &k[i]);
				if (strcmp(s, "beq") == 0)
					o[i] = 2;
				else if (strcmp(s, "bne") == 0)
					o[i] = 3;
				else if (strcmp(s, "blt") == 0)
					o[i] = 4;
				else if (strcmp(s, "bgt") == 0)
					o[i] = 5;
			}
			memset(vis[i], 0, sizeof(vis[i]));
		}
		int p = 1, r = 0;
		while (p <= n)
		{
			if (vis[p][r])
				break;
			vis[p][r] = true;
			if (o[p] == 1)
				r = (r + v[p]) % 256, p++;
			else if (o[p] == 2)
			{
				if (r == v[p])
					p = k[p];
				else
					p++;
			}
			else if (o[p] == 3)
			{
				if (r != v[p])
					p = k[p];
				else
					p++;
			}
			else if (o[p] == 4)
			{
				if (r < v[p])
					p = k[p];
				else
					p++;
			}
			else if (o[p] == 5)
			{
				if (r > v[p])
					p = k[p];
				else
					p++;
			}
		}
		if (p > n)
			printf("Yes\n");
		else
			printf("No\n");
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/CaprYang/article/details/82726283