ICPC 2018 青岛网络预赛 C Halting Problem

【题目链接】

题目意思

图灵停机问题,判断是否会停机,停机输出Yes,否则No。

Sample Input
4
2
add 1
blt 5 1
3
add 252
add 1
bgt 252 2
2
add 2
bne 7 1
3
add 1
bne 252 1
beq 252 1
Sample Output
Yes
Yes
No
No

Hint

For the second sample test case, note that is a 8-bit register, so after four “add 1” instructions the value of will change from 252 to 0, and the program will halt.

For the third sample test case, it’s easy to discover that the value of will always be even, so it’s impossible for the value of to be equal to 7, and the program will run forever.

解题思路

1.记忆化搜索,记录这一步某个数字是否出现过,若出现过,则可判断不会停机,否则,可停机。
2.标记是否出现过的数组千万别用int啊,要用bool,memset bool类型的数组只用了200ms,memset int类型用了900ms,怪不得比赛一直tle,QAQ。

AC代码

#include <iostream>
#include <cstring>
char s[10005][10];
int f[10005][2];
bool v[10005][258];
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		memset(v, 0, sizeof v);
		int n;
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
		{
			scanf("%s", s[i]);
			if (s[i][1] == 'd')
				scanf("%d", &f[i][0]);
			else
				scanf("%d%d", &f[i][0], &f[i][1]);
		}
		int flag = 1, num = 0;
		while (flag <= n)
		{
			if (v[flag][num])
			{
				printf("No\n");
				goto qwe;
			}
			v[flag][num] = true;
			if (s[flag][1] == 'd')
			{
				num += f[flag][0];
				num %= 256;
				flag++;
			}
			else if (s[flag][1] == 'e')
			{
				if (num == f[flag][0])
					flag = f[flag][1];
				else
					flag++;
			}
			else if (s[flag][1] == 'n')
			{
				if (num != f[flag][0])
					flag = f[flag][1];
				else
					flag++;
			}
			else if (s[flag][1] == 'l')
			{
				if (num < f[flag][0])
					flag = f[flag][1];
				else
					flag++;
			}
			else if (s[flag][1] == 'g')
			{
				if (num > f[flag][0])
					flag = f[flag][1];
				else
					flag++;
			}
		}
		printf("Yes\n");
	qwe:;
	}
}

全部评论

相关推荐

头像
02-15 16:23
中南大学 Java
野猪不是猪🐗:签了美团真是不一样! 亲戚们都知道我签了美团,过年都围着我问送一单多少钱,还让弟弟妹妹们引以为戒,笑我爸我妈养了个🐢孩子,说从小就知道我这个人以后肯定没出息,我被骂的都快上天了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务