#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define _y1 y1
const bool Multitest = 0;
const int N = 6e6 + 10;
int n, m, r;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int a[N], d[N], dp[N];
bitset<N> vis;
struct Data
{
int x, y, val;
Data() { }
Data(int _x, int _y, int _val) : x(_x), y(_y), val(_val) { }
}; deque<Data> q;
int id(int i, int j)
{
return (i - 1) * m + j;
}
int find(int i, int u)
{
if(d[id(i, u)] == u) return u;
int v = find(i, d[id(i, u)]);
d[id(i, u)] = v;
return v;
}
void merge(int i, int u, int v)
{
u = find(i, u), v = find(i, v);
d[id(i, u)] = v;
}
void update(int i, int l, int r, int val)
{
if(i <= 0 || i > n) return;
l = max(1, l); r = min(r, m);
int fi = find(i, l);
while(fi <= r)
{
if(dp[id(i, fi)] == -1)
{
q.push_back(Data(i, fi, val));
}
if(fi == m) return;
merge(i, fi, fi + 1);
fi = find(i, fi);
}
}
void work()
{
cin >> n >> m >> r;
int x1, x2, y1, y2; cin >> x1 >> y1 >> x2 >> y2;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
d[id(i, j)] = j;
}
}
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
char c; cin >> c;
if(c == '.') a[id(i, j)] = 1;
}
}
q.push_back(Data(x1, y1, 0));
vis[id(x1, y1)] = 1;
memset(dp, -1, sizeof dp);
while(!q.empty())
{
Data u = q.front(); q.pop_front();
if(u.y != m) merge(u.x, u.y, u.y + 1);
if(dp[id(u.x, u.y)] != -1) continue;
if(u.x == x2 && u.y == y2)
{
cout << u.val;
exit(0);
}
dp[id(u.x, u.y)] = u.val;
// bfs -> 0
for(int i = 0 ; i < 4 ; i++)
{
int x = u.x + dx[i];
int y = u.y + dy[i];
if(1 <= x && x <= n)
{
if(1 <= y && y <= m)
{
if(vis[id(x, y)] == 1) continue;
if(a[id(x, y)] == 0) continue;
q.push_front(Data(x, y, u.val));
vis[id(x, y)] = 1;
}
}
}
// bfs 1
int x = u.x, y = u.y;
update(x - r, y - r + 1, y + r - 1, u.val + 1);
for(int i = x - r + 1 ; i <= x + r - 1 ; i++)
{
update(i, y - r, y + r, u.val + 1);
}
update(x + r, y - r + 1, y + r - 1, u.val + 1);
}
cout << dp[id(x2, y2)];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int q = 1;
if(fopen("task.inp", "r"))
{
freopen("task.inp", "r", stdin);
freopen("task.out", "w", stdout);
}
if(Multitest) cin >> q;
while(q--) work();
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:160:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
160 | freopen("task.inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:161:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
161 | freopen("task.out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |