【发布时间】:2015-11-27 13:06:30
【问题描述】:
我被分配编写一个“迷宫”程序,允许用户通过从头到尾导航来玩和解决随机迷宫。到目前为止,我已经开发了一个可以很好地运行预定义迷宫的工作原型,但该机构要求我使其尽可能随机。为此,我包含了一个函数“findpath”,它检查并验证随机迷宫是否可以解决,或者调用“mazebuilder”来创建另一个随机迷宫。整个代码在这里:http://codepad.org/wb1OGGrZ。 现在在执行时,这个函数显示了非法的控制流。
int findpath(int x, int y)
{
if(fpmap[x][y]==END) //1
{
return TRUE;
}
if(fpmap[x][y]!=PATH||fpmap[x][y]!=START) //2
{
return FALSE; //2a
}
min_moves++; //3
fpmoves++;
fpmap[x][y]=SOLUTION;
if(findpath(x,y-1)) //4
{
return TRUE;
}
if(findpath(x+1,y))
{
return TRUE;
}
if(findpath(x,y+1))
{
return TRUE;
}
if(findpath(x-1,y))
{
return TRUE;
}
min_moves--; //5
fpmap[x][y]=PATH;
return FALSE; //6
}
我试图跟踪程序,这是该函数在调用时所做的: 1. 检查是否为#1。 2. 检查是否为#2。 3. 跳到#6。 那么,如果在#4 或#5 之后,程序为什么不转到#2a 或#3? 它似乎只是跳过了整个代码并冲到了#6。这是否存在逻辑错误或语法错误? 请帮我解决这个问题。 PS:这段代码是为 TurboC 编译器编写的,因为我的能力要求我这样做。请多多包涵:(
有关 findpath 中使用的算法的更多信息:http://www.cs.bu.edu/teaching/alg/maze
【问题讨论】:
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及重现它所需的最短代码在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example 示例。
-
“……机构要求我……”,对不起,我笑得太厉害了,听起来像是一个阴谋,这个秘密机构试图把我们所有人都困在一个巨大的迷宫中-声明
-
这段代码
if(fpmap[x][y]!=PATH||fpmap[x][y]!=START)应该使用&&而不是||。 -
感谢 Bo Persson,做到了(以及其他一些错误)。无法想象我会错过那个:/