C题——Halting Problem(补题)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4049

题解:题目要求判断是否会停止,r的状态共256种,i的状态共1e5种,用一个二维数组来标记状态,保证每个状态只出现一次,若出现两次,则会出现循环;

读题后先判断题目的状态数,根据状态数,计算复杂度,设计合适的算法;

 

细节问题:开始忘了加else,导致前面的 i f 改变了 i,后面又进入 i f 时 i  的值已被改变,不要手懒不写else;

#include<cstdio>
#include<cstring> 
typedef struct NODE{
    char s[10];
    int v;
    int k;
} Node;

Node step[10005];

int vis[260][10005];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int m;
        int r = 0;
        int flag = 0;
        memset(vis,0,sizeof(vis));
        scanf("%d",&m);
        for(int i = 1;i <= m;i++)
        {
            char st[3];
            scanf("%s",st);
            int vt;
            scanf("%d",&vt);
            if(st[1] == 'd')        //如果是add只有2个成员 
            {
                strcpy(step[i].s,st);
                step[i].v = vt;
            }
            else
            {
                int kt;
                scanf("%d",&kt);
                strcpy(step[i].s,st);
                step[i].v = vt;
                step[i].k = kt;
            }
        }
        int i = 1;
        while(i <= m)
        {
            if(step[i].s[1] == 'd')
            {
                r = (r + step[i].v) % 256;
                i++;                                
            }
            else if(step[i].s[1] == 'e')
                {
                    if(r == step[i].v)
                        i = step[i].k;
                    else
                    i++;
                }
            else if(step[i].s[1] == 'n')
                {
                    if(r != step[i].v)
                        i = step[i].k;
                    else
                    i++;
                }
            else if(step[i].s[1] == 'l')
                {
                    if(r < step[i].v)
                        i = step[i].k;
                    else
                    i++;
                }
            else if(step[i].s[1] == 'g')
                {
                    if(r > step[i].v)
                        i = step[i].k;
                    else
                    i++;
                }
            if(vis[r][i] != 0)
                {
                    printf("No\n");
                    flag = 1;
                    break;
                }
            vis[r][i] = 1;
        }
        if(flag == 0)
        {
            printf("Yes\n");
        }
        
    }
    return 0;
}

 

posted @ 2018-09-18 19:28  Dicer  阅读(229)  评论(0编辑  收藏  举报