我已经提到了许多文章和问题,这些文章和问题回答了如何有效地解决迷宫,但在这里我想确认我的代码中出了什么问题。考虑一下迷宫:
2 1 0 0 3
0 1 0 1 1
0 1 0 0 1
0 1 1 0 0
0 0 0 0 0
其中1代表墙,0代表路径。(来源为2,目的地为3)。 我必须输出是否有路径。
int y=0;
while(y==0)
{
robo1(n,m,maze);//this function adds 2 to any '0'/'3' in (i,j+1),(i+1,j),(i-1,j),(i,j-1) (if exists),where (i,j) is 2
robo2(n,m,k2,maze);//this function adds 3 to any '0'/'2' in (i,j+1),(i+1,j),(i-1,j),(i,j-1) (if exists), where (i,j) is 3
if(find5(n,m,maze)==1)//this function returns 1 if there is '5' in the maze
y++;
if(find0(n,m,maze)==0)//this function returns 0 if there are no '0' in the maze
break;
}
if(find0(n,m,maze)==0 && y==0)
printf("-1\n");//no path
else
printf("1\n");//there is a path
我的想法是,如果在迷宫中找到任意数量的循环五后,则意味着存在路径。 但是在代码中实现此功能时,我会得到错误的答案,有时会出现运行时错误。 上述逻辑是否有任何缺陷?
答案 0 :(得分:5)
一般的想法几乎应该有效,但当然一切都在细节中。
即使正确实施,您的方法也无法正常工作的一种情况:
2 1 0 0 0
1 1 0 1 1
0 0 0 1 3
即。如果2和3都是"关闭"在墙上,但房间里有0。你的循环将永远不会结束,因为尽管两个机器人函数都没有,但两个机器人都不会改变任何东西。
一个简单的解决方案是从robos返回0/1,如果它们实际上至少改变了矩阵中的一个值并且在没有发生这种情况时退出。
请注意,这不是解决迷宫的一种非常有效的方法(您的代码会不断多次检查相同的单元格)。