我试图从基础状态向上,向下,向左或向右返回方向,在递归状态下,我正在寻找可以移动的可能位置。但是程序只返回'q',它在函数启动时被初始化。我知道它与堆栈的展开有关,但我不知道如何解决这个问题。 这是迷宫:
-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
if(overlay == self.routeLine1)
{
if(nil == self.routeLineView1)
{
self.routeLineView1 = [[MKPolylineView alloc] initWithPolyline:self.routeLine1];
self.routeLineView1.fillColor = [UIColor greenColor];
self.routeLineView1.strokeColor = [UIColor greenColor];
self.routeLineView1.lineWidth = 5;
}
return self.routeLineView1;
}
if(overlay == self.routeLine2)
{
if(nil == self.routeLineView2)
{
self.routeLineView2 = [[MKPolylineView alloc] initWithPolyline:self.routeLine2];
self.routeLineView2.fillColor = [UIColor orangeColor];
self.routeLineView2.strokeColor = [UIColor orangeColor];
self.routeLineView2.lineWidth = 5;
}
return self.routeLineView2;
}
return nil;
}
以下是代码:
char [][]Maze = {{'S','#','#','#','#','#'},
{'.','.','.','.','.','#'},
{'#','.','#','#','#','#'},
{'#','.','#','#','#','#'},
{'.','.','.','#','.','G'},
{'#','#','.','.','.','#'}};
答案 0 :(得分:1)
首先,您可能需要检查并确保您不会超出范围。而不是像
这样的行if (Maze[x+1][y] == '.')
你想用
检查你的范围if (x+1<Maze.length && Maze[x+1][y] == '.')
否则你的程序应该崩溃,具体取决于你的起点。
其次,你的迷宫中没有'X'
,因此所有的递归案例都不会被执行。我认为它们应该是'#'
s,所以
if(Maze[x+1][y] == 'X')
从不起作用(除了可能的错误),应该像
if(x+1<Maze.length && Maze[x+1][y] == '#')
以便涉及'#'
。这些可能不会产生任何影响,具体取决于您点击'.'
的时间,这在您的迷宫中似乎是立即显示。
第三,你永远不会改变方向的价值,所以递归步骤将失败。这条线
BackTrace(Maze, x+1, y);
可能会从'd'
的基本案例返回,然后'd'
无处可去。我假设您想从基本案例中获得指示,在这种情况下您应该尝试
direction = BackTrace(Maze, x+1, y);
并类似地修改其他3个递归调用。除非'q'
或'.'
周围没有'#'
,否则这会让您无法获得'q'
。
我不知道这些更改是否会让您的方法按照您的意愿行事,但他们会做的不仅仅是返回 public static char BackTrace(char[][]Maze, int x, int y)
{
char direction = 'q';
if (x+1<Maze.length && Maze[x+1][y] == '.')
{
direction = 'd';
}
else if (x-1>=0 && Maze[x-1][y] == '.')
{
direction = 'u';
}
else if (y+1<Maze[x].length && Maze[x][y+1] == '.')
{
direction = 'r';
}
else if (y-1>=0 && Maze[x][y-1] == '.')
{
direction = 'l';
}
else
{
Maze[x][y] = '+';
if(x+1<Maze.length && Maze[x+1][y] == '#') /// Start moving Down
{
direction = BackTrace(Maze, x+1, y);
}
else if(x-1>=0 && Maze[x-1][y] == '#') /// Start Moving Up
{
direction = BackTrace(Maze, x-1, y);
}
else if(y+1<Maze[x].length && Maze[x][y+1] == '#') /// Start Moving Right
{
direction = BackTrace(Maze, x, y+1);
}
else if(y-1>=0 && Maze[x][y-1] == '#') /// Start Moving Left
{
direction = BackTrace(Maze, x, y-1);
}
}
return direction;
}
。
最终结果:
{{1}}
答案 1 :(得分:0)
好。我知道了。谢谢大家。问题在于,每次堆栈都会解除在更改新值时保留的旧方向值。只需在每次函数调用后添加一个return语句,以便在堆栈展开时返回新值。这是代码:
public static char BackTrace(char[][]Maze, int x, int y)
{
char direction = 'q';
if (Maze[x+1][y] == '.')
{
direction = 'd';
}
else if (Maze[x-1][y] == '.')
{
direction = 'u';
}
else if (Maze[x][y+1] == '.')
{
direction = 'r';
}
else if (Maze[x][y-1] == '.')
{
direction = 'l';
}
else
{
Maze[x][y] = '+';
if(Maze[x+1][y] == 'X') /// Start moving Down
{
direction = BackTrace(Maze, x+1, y);
return direction;
}
else if(Maze[x-1][y] == 'X') /// Start Moving Up
{
direction = BackTrace(Maze, x-1, y);
return direction;
}
else if(Maze[x][y+1] == 'X') /// Start Moving Right
{
direction = BackTrace(Maze, x, y+1);
return direction;
}
else if(Maze[x][y-1] == 'X') /// Start Moving Left
{
direction = BackTrace(Maze, x, y-1);
return direction;
}
}
return direction;
}
答案 2 :(得分:-1)
您忘记将递归调用的返回值分配给BackTrace到您的变量方向。
(即direction = BackTrace(Maze, x+1, y);
等。)