The 2018 ACM-ICPC Asia Qingdao Regional Contest C Halting Problem
阿新 • • 發佈:2018-12-10
題解
題目大意 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;
}