240 · 程序检查

240 · 程序检查
 

有一种编程语言,只有以下五种命令,每种命令最多有两个参数,请检查给定的程序是否 可能 无限循环。
这些命令分别是:

    label <string>:声明一个标签,参数是一个字符串,且每个标签只声明一次。
    goto <string>:跳转到一个标签,并从标签处开始按顺序执行程序。
    halt:停机,程序终止。
    print <string>:打印一个字符串,并执行下一个命令。
    gotorand <label1> <label2>:随机跳转到两个标签中的一个,并从标签处开始按顺序执行程序。

当程序执行完最后一句,且没有跳转时,程序终止。

设给定的程序的命令条数为 nnn,1≤n≤1031 \le n \le 10^31≤n≤10​3​​。
所有标签中只含有英文字符,且长度 mmm,1≤m≤51 \le m \le 51≤m≤5。
输出命令的字符串长度 lll,1≤l≤201 \le l \le 201≤l≤20。
样例中,每当程序执行到第三句 "gotorand start end" 后,都有可能回到第一句,从头执行,也可能跳到最后一句。第四,五句将不会被执行。
样例

输入:
label start
print "hello world!"
gotorand start end
print "good bye"
halt
label end

输出:
true

bool checkStr(vector<string> &commands, std::vector<bool> &visitedVec,std::string &comStr,int &num)
{
    if (comStr.substr(0, 5) == "goto ")
    {
        int pos = comStr.find(' ');
        std::string lab = "label" + comStr.substr(pos);
        for (int i = 0; i < commands.size(); i++)
        {
            if (commands[i] == lab)
            {
                if (true == visitedVec[i])
                {
                     return true;
                }
                else
                {
                    visitedVec[i] = true;
                    num = i;
                    return false;
                }
            }
        }
    }
    else if (comStr.substr(0, 5) == "gotor") //gotorand start end
    {
        int pos = comStr.find(' ');
        std::string str1 = comStr.substr(pos + 1);
        int pos1 = str1.find(' ');
        std::string lab1Target = "label " + str1.substr(0, pos1); //label start
        std::string lab2Target = "label " + str1.substr(pos1 + 1);//label end

        for (int i = 0; i < commands.size(); i++)
        {
            if (commands[i] == lab1Target || commands[i] == lab2Target)
            {
                if (true == visitedVec[i])
                {
                    return true;
                }
                else
                {
                    visitedVec[i] = true;
                    num = i;
                    return false;
                }
            }
        }    
    }
}

 

bool findLoop(vector<string> &commands, std::vector<bool> &visitedVec)
{
    int i = 0;
    while ( i < commands.size())
    {
        if (true == visitedVec[i])
        {
            return true;
        }
        std::string comstr = commands[i].substr(0, 2);
        if ("ha" == comstr)
        {
            return false;
        }
        else if ("go" == comstr)
        {
            
            bool ret = checkStr(commands, visitedVec, commands[i], i);
            if (ret == true)
            {
                return true;
            }
        }
        else
        {
            visitedVec[i] = true;
        }
        i++;
    }
    return false;
}

bool check(vector<string> &commands)
{
    std::vector<bool> visitedVec(commands.size(), false);
    return findLoop(commands, visitedVec);
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值