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

猜你喜欢

转载自www.cnblogs.com/the-way-of-cas/p/9670742.html
今日推荐