#define ll long long #define ffor(i, a, b) for (int i = (a); i < (b); i++) #define rfor(i, a, b) for (int i = (b)-1; i >= (a); i--) #define rep(i, n) for (int i = 0; i < (n); i++) #define rrep(i, n) for (int i = (n)-1; i >= 0; i--) #include #include #include #include #include #include #include #include #include #include #include #define SIZE 100001 #define MOD 1000000007 #define INF 100000000 using namespace std; int h, w, sx, sy, gx, gy; string b[51]; int visited[51][51]; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; typedef pair P; bool bfs() { rep(i, h) rep(j, w) visited[i][j] = 0; queue

que; sx--; sy--; gx--; gy--; que.push(P(sy, sx)); visited[sx][sy] = 1; int flag = 1; while (!que.empty()) { P p = que.front(); que.pop(); if (p.first == gy && p.second == gx) break; rep(i, 4) { int nx = p.second + dx[i]; int ny = p.first + dy[i]; if (0 <= ny && ny < w && 0 <= nx && nx < h && visited[nx][ny] == 0) { int h1 = b[nx][ny] - '0'; int h2 = b[p.second][p.first] - '0'; if (abs(h1 - h2) <= 1) { visited[nx][ny] = 1; que.push(P(ny, nx)); } } } rep(i, 4) { int nx = p.second + 2 * dx[i]; int ny = p.first + 2 * dy[i]; if (0 <= ny && ny < w && 0 <= nx && nx < h && visited[nx][ny] == 0) { int h1 = b[nx][ny] - '0'; int h2 = b[p.second][p.first] - '0'; int half = b[(nx + p.second) / 2][(ny + p.first) / 2] - '0'; if ((h1 == h2) && (h1 - half) > 0) { visited[nx][ny] = 1; que.push(P(ny, nx)); } } } } return visited[gx][gy]; } int main() { scanf("%d%d", &h, &w); scanf("%d%d%d%d", &sx, &sy, &gx, &gy); rep(i, h) cin >> b[i]; if (bfs()) printf("YES\n"); else printf("NO\n"); return 0; }