#include <bits/stdc++.h>
#define MAXN 1507
using namespace std;
int n,m,rows,cols;
int lx,ly,ux,uy;
int sx,sy,ex,ey;
char t[MAXN][MAXN];
int fromy[MAXN][MAXN],toy[MAXN][MAXN];
int fromx[MAXN][MAXN],tox[MAXN][MAXN];
int pr[MAXN][MAXN],nxt[MAXN][MAXN];
bool block[MAXN][MAXN];
vector<int> g[MAXN*MAXN];
bool vis[MAXN*MAXN];
void calc_states(){
    for(int i=1;i<=n;i++){
        int last=0;
        for(int f=1;f<=m;f++){
            if(t[i][f]=='X')last=f;
            pr[i][f]=last;
        }
        last=m+1;
        for(int f=m;f>=1;f--){
            if(t[i][f]=='X')last=f;
            nxt[i][f]=last;
        }
        for(int f=1;f<=m;f++){
            if(t[i][f]=='X')continue;
            if(nxt[i][f]-pr[i][f]-1<cols)block[i][f]=true;
            else{
                fromy[i][f]=max(pr[i][f]+1,f-cols+1);
                toy[i][f]=min(nxt[i][f]-cols,f);
            }
        }
    }
    for(int f=1;f<=m;f++){
        int last=0;
        for(int i=1;i<=n;i++){
            if(t[i][f]=='X')last=i;
            pr[i][f]=last;
        }
        last=n+1;
        for(int i=n;i>=1;i--){
            if(t[i][f]=='X')last=i;
            nxt[i][f]=last;
        }
        for(int i=1;i<=n;i++){
            if(t[i][f]=='X')continue;
            if(nxt[i][f]-pr[i][f]-1<rows)block[i][f]=true;
            else{
                fromx[i][f]=max(pr[i][f]+1,i-rows+1);
                tox[i][f]=min(nxt[i][f]-rows,i);
            }
        }
    }
}
bool ok(int a,int b,int c,int d){
    if(b<c or d<a)return false;
    return true;
}
void build_graph(){
    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            if(block[i][f])continue;
            if(!block[i][f+1] and ok(fromx[i][f],tox[i][f],fromx[i][f+1],tox[i][f+1])){
                g[i*m+f].push_back(i*m+f+1);
                g[i*m+f+1].push_back(i*m+f);
            }
            if(!block[i+1][f] and ok(fromy[i][f],toy[i][f],fromy[i+1][f],toy[i+1][f])){
                g[i*m+f].push_back((i+1)*m+f);
                g[(i+1)*m+f].push_back(i*m+f);
            }
        }
    }
}
bool dfs(int x,int y){
    if(x==y)return true;
    vis[x]=true;
    for(int i:g[x]){
        if(vis[i])continue;
        if(dfs(i,y))return true;
    }
    return false;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>m>>n>>cols>>rows;
    cin>>lx>>ly>>ux>>uy;
    lx++; ly++; ux++; uy++;
    sx=ly; sy=ux;
    
    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            cin>>t[i][f];
            if(t[i][f]=='X')block[i][f]=true;
            if(t[i][f]=='*'){
                ex=i; ey=f;
            }
        }
    }
    calc_states();
    build_graph();
    if(dfs(sx*m+sy,ex*m+ey)){
        cout<<"YES\n";
    }else{
        cout<<"NO\n";
    }
    return 0;
}
| # | 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... |