#include <iostream>
#include <queue>
using namespace std;
const int N = 1505;
int a[N][N], up[N][N], down[N][N], lft[N][N], rgt[N][N], seen[N][N];
int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n, m, k, l, xh, yh, xv, yv, tx, ty;
	cin>>m>>n>>k>>l>>xh>>yh>>xv>>yv;
	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++){
			char c;
			cin>>c;
			if (c == '*')
				tx = i, ty = j;
			a[i][j] = (c != 'X');
		}
	}
	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++)
			lft[i][j] = (lft[i][j-1] + 1) * a[i][j];
		for (int j=m;j>=1;j--)
			rgt[i][j] = (rgt[i][j+1] + 1) * a[i][j];
		for (int j=1;j<=m;j++)
			up[i][j] = (up[i-1][j] + 1) * a[i][j];
	}
	for (int i=n;i>=1;i--)
		for (int j=1;j<=m;j++)
			down[i][j] = (down[i+1][j] + 1) * a[i][j];
	queue<pair<int,int>> Q;
	Q.push({yh +1, xv +1});
	seen[yh+1][xv+1] = 1;
	while (Q.size() > 0){
		auto [i, j] = Q.front();
		Q.pop();
		if (!seen[i+1][j] and min(lft[i][j], lft[i+1][j]) + min(rgt[i][j], rgt[i+1][j]) > k)
			seen[i+1][j] = 1, Q.push({i+1, j});
		if (!seen[i-1][j] and min(lft[i][j], lft[i-1][j]) + min(rgt[i][j], rgt[i-1][j]) > k)
			seen[i-1][j] = 1, Q.push({i-1, j});
		
		if (!seen[i][j+1] and min(up[i][j], up[i][j+1]) + min(down[i][j], down[i][j+1]) > l)
			seen[i][j+1] = 1, Q.push({i, j+1});
		
		if (!seen[i][j-1] and min(up[i][j], up[i][j-1]) + min(down[i][j], down[i][j-1]) > l)
			seen[i][j-1] = 1, Q.push({i, j-1});
	}
	cout<<(seen[tx][ty] ? "YES\n" : "NO\n");
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |