#pragma target("arch=icelake-server")
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <stack>
#include <queue>
#include <cmath>
#include <random>
#include <chrono>
#include <iomanip>
#include <bitset>
using namespace std;
typedef long long ll;
typedef long double ld;
int log_ = 12;
int inf = 1000000007;
long long mod = 998244353;
int p = 499;
int NADIYA = 39;
int n, m;
vector <pair <int, int>> go = { {0 , 1} , {0 , -1} , {1 , 0} , {-1 , 0} };
vector <vector <int>> deep;
vector <vector <bool>> t;
bool checer(int i, int j) {
if ((i < 0) or (j < 0))
return false;
if ((i >= n) or (j >= m))
return false;
return true;
}
queue<pair <int, int>> q1;
queue<pair <int, int>> q2;
vector <set <int>> vs_n;
vector <set <int>> vs_m;
void dfs(int i, int j) {
vs_n[i].erase(j);
vs_m[j].erase(i);
for (int k = 0; k < 4; k++) {
int i_ = i + go[k].first;
int j_ = j + go[k].second;
if (checer(i_, j_) == true) {
if ((deep[i_][j_] == inf) and (t[i_][j_] == 0)) {
deep[i_][j_] = deep[i][j];
q1.push({ i_, j_ });
dfs(i_, j_);
continue;
}
}
}
}
vector <vector <int>> t2;
int k;
void dfs2(int i, int j) {
t2[i][j] = 1;
for (int K = 0; K < 4; K++) {
int i_ = i + go[K].first;
int j_ = j + go[K].second;
if (checer(i_, j_) == true) {
if ((deep[i_][j_] == deep[i][j]) and (t2[i_][j_] == 0)) {
dfs2(i_, j_);
if (abs(j_ - j) == 1) {
int P = (j_ - j) * k;
int j__ = j_ + P;
if ((j__ < m) and (j__ >= 0))
{
int mn_ = i_ - k + 1;
int mx_ = i_ + k - 1;
mn_ = max(mn_, 0);
mx_ = min(mx_, n - 1);
while (*vs_m[j__].lower_bound(mn_) <= mx_) {
int i__ = *vs_m[j__].lower_bound(mn_);
deep[i__][j__] = deep[i][j] + 1;
q2.push({ i__, j__ });
vs_m[j__].erase(i__);
vs_n[i__].erase(j__);
}
}
P /= k;
P *= k - 1;
int i2 = i_ - k;
int j2 = j_ + P;
if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) {
vs_n[i2].erase(j2);
vs_m[j2].erase(i2);
deep[i2][j2] = deep[i][j] + 1;
q2.push({ i2 , j2 });
}
i2 = i_ + k;
j2 = j_ + P;
if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) {
vs_n[i2].erase(j2);
vs_m[j2].erase(i2);
deep[i2][j2] = deep[i][j] + 1;
q2.push({ i2 , j2 });
}
}
if (abs(i_ - i) == 1) {
int P = (i_ - i) * k;
int i__ = i_ + P;
if ((i__ < n) and (i__ >= 0))
{
int mn_ = j_ - k + 1;
int mx_ = j_ + k - 1;
mn_ = max(mn_, 0);
mx_ = min(mx_, m - 1);
while (*vs_n[i__].lower_bound(mn_) <= mx_) {
int j__ = *vs_n[i__].lower_bound(mn_);
deep[i__][j__] = deep[i][j] + 1;
q2.push({ i__, j__ });
vs_m[j__].erase(i__);
vs_n[i__].erase(j__);
}
}
P /= k;
P *= k - 1;
int j2 = j_ - k;
int i2 = i_ + P;
if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) {
vs_n[i2].erase(j2);
vs_m[j2].erase(i2);
deep[i2][j2] = deep[i][j] + 1;
q2.push({ i2 , j2 });
}
j2 = j_ + k;
i2 = i_ + P;
if ((checer(i2, j2) == true) and (vs_n[i2].count(j2) > 0)) {
vs_n[i2].erase(j2);
vs_m[j2].erase(i2);
deep[i2][j2] = deep[i][j] + 1;
q2.push({ i2 , j2 });
}
}
}
}
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m >> k;
int i_st, j_st;
cin >> i_st >> j_st;
i_st--;
j_st--;
int i_fi, j_fi;
cin >> i_fi >> j_fi;
i_fi--;
j_fi--;
t.resize(n);
for (int i = 0; i < n; i++) {
t[i].resize(m);
string s;
cin >> s;
for (int j = 0; j < m; j++) {
if (s[j] == '.')
t[i][j] = 0;
else
t[i][j] = 1;
}
}
vs_n.resize(n);
vs_m.resize(m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
vs_n[i].insert(j);
vs_m[j].insert(i);
}
}
for (int i = 0; i < n; i++) {
vs_n[i].insert(-1);
vs_n[i].insert(m);
}
for (int j = 0; j < m; j++) {
vs_m[j].insert(-1);
vs_m[j].insert(n);
}
deep.resize(n);
for (int i = 0; i < n; i++) {
deep[i].resize(m, inf);
}
deep[i_st][j_st] = 0;
vs_n[i_st].erase(j_st);
vs_m[j_st].erase(i_st);
q1.push({ i_st , j_st });
t2.resize(n);
for (int i = 0; i < n; i++)
{
t2[i].resize(m);
}
for (int d = 0; d < n * m; d++) {
int d__ = inf;
int i_ = -1;
int j_ = -1;
while (q1.size() > 0) {
int i = q1.front().first;
int j = q1.front().second;
vs_n[i].erase(j);
vs_m[j].erase(i);
q1.pop();
if (d__ > abs(i - i_fi) + abs(j - j_fi)) {
d__ = abs(i - i_fi) + abs(j - j_fi);
i_ = i;
j_ = j;
}
dfs(i, j);
}
dfs2(i_, j_);
swap(q1, q2);
}
int ans = inf;
for (int K = 0; K < 4; K++)
{
int i = i_fi + go[K].first;
int j = j_fi + go[K].second;
if (checer(i, j))
{
ans = min(ans, deep[i][j]);
}
}
cout << min(ans ,deep[i_fi][j_fi]);
}
/*
7 1 1
1 1
7 1
.
#
.
#
#
#
.
*/
# | 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... |