#include #include #include #include #include using namespace std; typedef pair P; int MAZE[51][51]; int w, h; int sx, sy, gx, gy; int d[51][51]; int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 }; int bfs() { queue

que; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) d[i][j] = INT32_MAX; } que.push(P(sx, sy)); d[sx][sy] = 0; while (que.size()) { P p = que.front(); que.pop(); if (p.first == gx && p.second == gy) break; for (int i = 0; i < 4; i++) { int nx = p.first + dx[i], ny = p.second + dy[i]; if (0 <= nx && nx < h && 0 <= ny && ny < w && abs(MAZE[nx][ny] - MAZE[p.first][p.second]) <= 1 && d[nx][ny] == INT32_MAX) { que.push(P(nx, ny)); d[nx][ny] = d[p.first][p.second] + 1; } } for (int i = 0; i < 4; i++) { int nx = p.first + 2*dx[i], ny = p.second + 2*dy[i]; if (0 <= nx && nx < h && 0 <= ny && ny < w && (MAZE[nx][ny] - MAZE[p.first][p.second]) == 0 && d[nx][ny] == INT32_MAX) { if ((nx == p.first && MAZE[nx][(ny + p.second) / 2] < MAZE[nx][ny]) || (ny == p.second && MAZE[(nx + p.first) / 2][ny] < MAZE[nx][ny])) { que.push(P(nx, ny)); d[nx][ny] = d[p.first][p.second] + 1; } } } } return d[gx][gy]; } int main() { cin >> h >> w >> sx >> sy >> gx >> gy; sx--; sy--; gx--; gy--; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { char c; cin >> c; MAZE[i][j] = c-'0'; } } if (bfs() != INT32_MAX)cout << "YES" << endl; else cout << "NO" << endl; return 0; }