Ваш поиск никогда не начинается, потому что ваш метод valid
сообщает о начальной точке, s
как о недействительной.
Быстрое решение состоит в том, чтобы изменить:
if (maze[row][column] == ' ')
a = true;
на
if (maze[row][column] == ' ' || maze[row][column] == 's')
a = true;
Другая проблема заключается в том, что вы перезаписываете финишную ячейку как посещенную перед проверкой:
maze[row][column] = 'v'; //mark as visited
if (maze[row][column] == 'f') //check for finish
success = true;
Вам необходимо реструктурировать свой метод решения, чтобы он выглядел примерно так:
public static boolean solve(char[][] maze, int row, int column)
{
boolean success = false;
if (maze[row][column] == 'f') //check for finish
success = true;
else if(valid(maze, row, column))
{
maze[row][column] = 'v'; //mark as visited
success = solve(maze, row - 1, column); //north
if(!success)
success = solve(maze, row, column + 1); //west
if(!success)
success = solve(maze, row, column - 1); //east
if(!success)
success = solve(maze, row + 1, column); //south
if(success) //mark as path
maze[row][column] = 'p';
}
return success;
}
С этими изменениями ваш код прекрасно работает:
Success
xxxxxxxxxxxxxxxxxxfx
x xpppppppxxxxpx
x xxxxxpxxxxxpppxxpx
x xxxxxpxxxxxxxpxxpx
x ppppppxxpxxpx
x xxxxxxxxxxpxxppppx
xxxxxxxxxxxxpxxxxxxx