2018ICPC青岛网络赛-Halting Problem 思路题
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4049
题意:判断代码是否死循环,是的话输出No,不是输出Yes
思路:死循环的特点是重复,所以只要判断同样的r是否在同一行出现过,如果出现1次以上,就是死循环。
代码:
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #define maxn 10009 #define MOD 256 using namespace std; int n; bool zt[257][maxn]; int v[maxn], k[maxn]; char ss[maxn][4]; int main() { int t; cin >> t; while (t--) { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%s", ss[i]); if (ss[i][1] == 'd') { scanf("%d", &v[i]); } else { scanf("%d %d", &v[i], &k[i]); } } int r = 0; bool ff = 0; for (int i = 1; i <= n; i++) { if (zt[r][i]) { ff = 1; break; } zt[r][i] = 1; if (ss[i][1] == 'd') { r += v[i]; r %= MOD; } else if (ss[i][1] == 'e') { if (r == v[i]) { i = k[i] - 1; } } else if (ss[i][1] == 'n') { if (r != v[i]) { i = k[i] - 1; } } else if (ss[i][1] == 'l') { if (r < v[i]) { i = k[i] - 1; } } else if (ss[i][1] == 'g') { if (r > v[i]) { i = k[i] - 1; } } } if (ff) printf("No\n"); else printf("Yes\n"); memset(zt, 0, sizeof zt); } return 0; }