7
bool hasValidPath(vector<vector<int>> &grid) {11
memset(vis, false, sizeof(vis));13
return vis[n - 1][m - 1];16
void dfs(int ux, int uy) {20
if (g[ux][uy] == 1 || g[ux][uy] == 4 || g[ux][uy] == 6) {22
if (valid(vx, vy) && L_enter(vx, vy)) dfs(vx, vy);24
if (g[ux][uy] == 1 || g[ux][uy] == 3 || g[ux][uy] == 5) {26
if (valid(vx, vy) && R_enter(vx, vy)) dfs(vx, vy);28
if (g[ux][uy] == 2 || g[ux][uy] == 3 || g[ux][uy] == 4) {30
if (valid(vx, vy) && D_enter(vx, vy)) dfs(vx, vy);32
if (g[ux][uy] == 2 || g[ux][uy] == 5 || g[ux][uy] == 6) {34
if (valid(vx, vy) && U_enter(vx, vy)) dfs(vx, vy);37
bool valid(int x, int y) {38
if (x >= 0 && y >= 0 && x < n && y < m && !vis[x][y]) return true;41
bool L_enter(int x, int y) {42
if (g[x][y] % 2) return true;45
bool R_enter(int x, int y) {46
if (g[x][y] == 1 || g[x][y] == 4 || g[x][y] == 6) return true;49
bool D_enter(int x, int y) {50
if (g[x][y] == 2 || g[x][y] == 5 || g[x][y] == 6) return true;53
bool U_enter(int x, int y) {54
if (g[x][y] == 2 || g[x][y] == 3 || g[x][y] == 4) return true;