240 · 程序检查
有一种编程语言,只有以下五种命令,每种命令最多有两个参数,请检查给定的程序是否 可能 无限循环。
这些命令分别是:
label <string>:声明一个标签,参数是一个字符串,且每个标签只声明一次。
goto <string>:跳转到一个标签,并从标签处开始按顺序执行程序。
halt:停机,程序终止。
print <string>:打印一个字符串,并执行下一个命令。
gotorand <label1> <label2>:随机跳转到两个标签中的一个,并从标签处开始按顺序执行程序。
当程序执行完最后一句,且没有跳转时,程序终止。
设给定的程序的命令条数为 nnn,1≤n≤1031 \le n \le 10^31≤n≤103。
所有标签中只含有英文字符,且长度 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);
}