1. 程式人生 > >The 2018 ACM-ICPC Asia Qingdao Regional Contest C Halting Problem

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