0x01.问题
给你一个 m x n 的网格
grid
。网格里的每个单元都代表一条街道。grid[i][j]
的街道可以是:
- 1 表示连接左单元格和右单元格的街道。
- 2 表示连接上单元格和下单元格的街道。
- 3 表示连接左单元格和下单元格的街道。
- 4 表示连接右单元格和下单元格的街道。
- 5 表示连接左单元格和上单元格的街道。
- 6 表示连接右单元格和上单元格的街道。
你最开始从左上角的单元格
(0,0)
开始出发,网格中的「有效路径」是指从左上方的单元格
(0,0)
开始、一直到右下方的(m-1,n-1)
结束的路径。该路径必须只沿着街道走。
注意:你 不能 变更街道。
如果网格中存在有效的路径,则返回true
,否则返回false
。
注:题目来源于leetcode第181场周赛,第3题,前往:戳我前往
0x02.简要分析
只需要从原点开始,根据题目的走法,不断的去搜索就行了。
采用temp
优化掉一个备忘录,便于恢复状态。
思路是普通的DFS
的思路。
要注意横坐标和纵坐标的实际含义。
0x03.解决代码–DFS
class Solution {
public:
bool dfs(vector<vector<int>>& grid,int x,int y){
if(y==grid.size()-1&&x==grid[0].size()-1) return true;
int temp=grid[y][x];
grid[y][x]=0;
if(temp==1){
//向右走
if(x+1<grid[0].size()&&(grid[y][x+1]==1||grid[y][x+1]==3||grid[y][x+1]==5)){
if(dfs(grid,x+1,y)) return true;
}
//向左走
if(x-1>=0&&(grid[y][x-1]==1||grid[y][x-1]==4||grid[y][x-1]==6)){
if(dfs(grid,x-1,y)) return true;
}
}
else if(temp==2){
//向下走
if(y+1<grid.size()&&(grid[y+1][x]==2||grid[y+1][x]==5||grid[y+1][x]==6)){
if(dfs(grid,x,y+1)) return true;
}
//向上走
if(y-1>=0&&(grid[y-1][x]==2||grid[y-1][x]==3||grid[y-1][x]==4)){
if(dfs(grid,x,y-1)) return true;
}
}
else if(temp==3){
//向左走
if(x-1>=0&&(grid[y][x-1]==1||grid[y][x-1]==4||grid[y][x-1]==6)){
if(dfs(grid,x-1,y)) return true;
}
//向下走
if(y+1<grid.size()&&(grid[y+1][x]==2||grid[y+1][x]==5||grid[y+1][x]==6)){
if(dfs(grid,x,y+1)) return true;
}
}
else if(temp==4){
//向右走
if(x+1<grid[0].size()&&(grid[y][x+1]==1||grid[y][x+1]==3||grid[y][x+1]==5)){
if(dfs(grid,x+1,y)) return true;
}
//向下走
if(y+1<grid.size()&&(grid[y+1][x]==2||grid[y+1][x]==5||grid[y+1][x]==6)){
if(dfs(grid,x,y+1)) return true;
}
}
else if(temp==5){
//向左走
if(x-1>=0&&(grid[y][x-1]==1||grid[y][x-1]==4||grid[y][x-1]==6)){
if(dfs(grid,x-1,y)) return true;
}
//向上走
if(y-1>=0&&(grid[y-1][x]==2||grid[y-1][x]==3||grid[y-1][x]==4)){
if(dfs(grid,x,y-1)) return true;
}
}
else if(temp==6){
//向右走
if(x+1<grid[0].size()&&(grid[y][x+1]==1||grid[y][x+1]==3||grid[y][x+1]==5)){
if(dfs(grid,x+1,y)) return true;
}
//向上走
if(y-1>=0&&(grid[y-1][x]==2||grid[y-1][x]==3||grid[y-1][x]==4)){
if(dfs(grid,x,y-1)) return true;
}
}
grid[y][x]=temp;
return false;
}
bool hasValidPath(vector<vector<int>>& grid) {
return dfs(grid,0,0);
}
};
ATFWUS --Writing By 2020–03–22