record
#include<bits/stdc++.h>
#define int long long
using namespace std;
int h,w,d,r;
char a[1001][1001];
int dis[1001][1001][2];
bool vis[1001][1001][2];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
struct node{
int x,y,used;
};
void bfs(){
queue <node> q;
q.push({1,1,0});
dis[1][1][0]=0;
while(q.size()){
node now=q.front();
q.pop();
int x=now.x,y=now.y,z=now.used;
vis[x][y][z]=1;
for(int i=0;i<4;i++){
int lx=x+dx[i],ly=y+dy[i];
if(!vis[lx][ly][z]&&a[lx][ly]=='.'&&lx>=1&&lx<=h&&ly>=1&&ly<=w){
q.push({lx,ly,z});
dis[lx][ly][z]=min(dis[x][y][z]+1,dis[lx][ly][z]);
}
}
if(!z&&a[x+d][y+r]=='.'&&x+d>=1&&x+d<=h&&y+r>=1&&y+r<=w&&!vis[x+d][y+r][z]){
dis[x+d][y+r][1]=min(dis[x][y][0]+1,dis[x+d][y+r][1]);
q.push({x+d,y+r,1});
}
}
}
signed main(){
cin>>h>>w>>d>>r;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++) cin>>a[i][j];
}
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
dis[i][j][1]=dis[i][j][0]=INT_MAX;
}
}
bfs();
int ans=min(dis[h][w][1],dis[h][w][0]);
if(ans==INT_MAX) cout<<-1;
else cout<<ans;
return 0;
}