Halting Problem

时间:2021-07-13 23:39:50

Halting Problem:

传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4049

总结一个小规律:题目中给的那个取mod的那个数N, 可能就是循环的边界;

本题AC代码:

 /* */
# include <bits/stdc++.h> using namespace std;
const int N = 1e4+; struct node
{
char s[];
int v, k;
} a[N]; int vis[N]; int main()
{
int t;
scanf("%d", &t);
while( t-- )
{
memset(vis,,sizeof(vis));
int n;
scanf("%d", &n);
for( int i=; i<=n; i++ )
{
scanf("%s", a[i].s);
if( strcmp(a[i].s, "add") != )
{
scanf("%d %d", &a[i].v, &a[i].k);
}
else
{
scanf("%d", &a[i].v);
}
}
int r = ;
int flag=;
for( int i=; i<=n; i++ )///跳出循环的第一个条件
{
vis[i]++;
if( vis[i]> )///重点!!!终止循环的条件,每一步最多走256次,否则就陷入了死循环
{
flag = ;
break;
}
if( strcmp(a[i].s, "add")== )
{
r = (r+a[i].v)%;
}
else if( strcmp(a[i].s, "beq")== )
{
if( r==a[i].v )
{
i = a[i].k - ;///要跳到第k步,但是for循环的时候i还会++,所以i要先到(k-1)步
}
}
else if( strcmp(a[i].s, "bne")== )
{
if( r!=a[i].v )
{
i = a[i].k - ;
}
}
else if( strcmp(a[i].s, "blt")== )
{
if( r<a[i].v )
{
i = a[i].k - ;
}
}
else if( strcmp(a[i].s, "bgt")== )
{
if( r>a[i].v )
{
i = a[i].k - ;
}
}
}
if( flag )
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return ;
}