题解
此题不同于以往的走迷宫问题,并非在每个格子都可以改变方向,只有碰到墙壁情况,停下来,才能换方向继续走,所以会比普通走迷宫多一段直线走的代码
for (int i=0; i<4; i++) {
int dx = x + dirx[i];
int dy = y + diry[i];
while(dx>=0 && dx<n && dy>=0 && dy<m && maze[dx][dy] == 0) {
dx = dx + dirx[i];
dy = dy + diry[i];
}
DFS完整代码 C++
class Solution {
public:
int dirx[4] = {0, 1, 0, -1};
int diry[4] = {1, 0, -1, 0};
int visit[101][101];
int ex, ey;
int n, m;
bool hasPath(vector<vector<int>>& maze, vector<int>& start, vector<int>& destination) {
int sx = start[0], sy = start[1];
n = maze.size();
m = maze[0].size();
ex = destination[0], ey = destination[1];
memset(visit, 0, sizeof(visit));
visit[sx][sy] = 1;
if (DFS(sx, sy, maze)) return true;
else return false;
}
bool DFS(int x, int y, const vector<vector<int>> &maze) {
if (x == ex && y == ey) {
return true;
}
for (int i=0; i<4; i++) {
int dx = x + dirx[i];
int dy = y + diry[i];
while(dx>=0 && dx<n && dy>=0 && dy<m && maze[dx][dy] == 0) {
dx = dx + dirx[i];
dy = dy + diry[i];
}
dx = dx - dirx[i];
dy = dy - diry[i];
if(visit[dx][dy]) continue;
visit[dx][dy] = 1;
bool flag = DFS(dx, dy, maze);
if (flag) return true;
}
return false;
}
};