給你一個 m x n 的網格 grid
。網格里的每個單元都代表一條街道。grid[i][j]
的街道可以是:
- 1 表示連接左單元格和右單元格的街道。
- 2 表示連接上單元格和下單元格的街道。
- 3 表示連接左單元格和下單元格的街道。
- 4 表示連接右單元格和下單元格的街道。
- 5 表示連接左單元格和上單元格的街道。
- 6 表示連接右單元格和上單元格的街道。
你最開始從左上角的單元格 (0,0)
開始出發,網格中的「有效路徑」是指從左上方的單元格 (0,0)
開始、一直到右下方的 (m-1,n-1)
結束的路徑。該路徑必須只沿着街道走。
注意:你 不能 變更街道。
如果網格中存在有效的路徑,則返回 true
,否則返回 false
。
示例 1:
輸入:grid = [[2,4,3],[6,5,2]] 輸出:true 解釋:如圖所示,你可以從 (0, 0) 開始,訪問網格中的所有單元格併到達 (m - 1, n - 1) 。
示例 2:
輸入:grid = [[1,2,1],[1,2,1]] 輸出:false 解釋:如圖所示,單元格 (0, 0) 上的街道沒有與任何其他單元格上的街道相連,你只會停在 (0, 0) 處。
示例 3:
輸入:grid = [[1,1,2]] 輸出:false 解釋:你會停在 (0, 1),而且無法到達 (0, 2) 。
示例 4:
輸入:grid = [[1,1,1,1,1,1,3]] 輸出:true
示例 5:
輸入:grid = [[2],[2],[2],[2],[2],[2],[6]] 輸出:true
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
1 <= grid[i][j] <= 6
C++
class Solution {
public:
bool hasValidPath(vector<vector<int>>& grid)
{
int m=grid.size();
int n=grid[0].size();
vector<vector<int>> flag(m,vector<int>(n,0));
queue<pair<int,int>> tmp;
tmp.push(make_pair(0,0));
int dx[]={-1,0,1,0};
int dy[]={0,-1,0,1};
int a[6][4]={{1,0,1,0},{0,1,0,1},{1,0,0,1},{0,0,1,1},{1,1,0,0},{0,1,1,0}};
while(!tmp.empty())
{
auto it=tmp.front();
tmp.pop();
int i=it.first;
int j=it.second;
if(i==m-1 && j==n-1)
{
return true;
}
flag[i][j]=1;
for(int k=0;k<4;k++) //左、上、右、下
{
int y=i+dy[k];
int x=j+dx[k];
if(y>=0 && y<m && x>=0 && x<n && 0==flag[y][x])
{
int begin=grid[i][j]-1;
int end=grid[y][x]-1;
if(a[begin][k] && a[end][(k+2)%4])
{
flag[y][x]=1;
tmp.push(make_pair(y,x));
}
}
}
}
return false;
}
};