Submission #1121389

#TimeUsernameProblemLanguageResultExecution timeMemory
1121389stefanneaguMaze (JOI23_ho_t3)C++17
51 / 100
2072 ms200624 KiB
#include <bits/stdc++.h>

using namespace std;

int dx[] = {1, -1, 0,  0};
int dy[] = {0, 0,  -1, 1};

vector<vector<char>> v;
vector<vector<int>> dp;
vector<set<int>> s;
queue<pair<int, int>> q;

int f[101][101];

void flood_fill(int i, int j, int val) {
	for(int d = 0; d < 4; d++) {
		int a = i + dx[d];
		int b = j + dy[d];
		if(v[a][b] == '.' && s[a].find(b) != s[a].end()) {
			q.push({a, b});
			s[a].erase(b);
			dp[a][b] = val;
			flood_fill(a, b, val);
		}
	}
}

int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie();
  cout.tie();
  int n, m, d;
  cin >> n >> m >> d;
  v.resize(n + 2, vector<char>(m + 2));
  dp.resize(n + 2, vector<int>(m + 2));
  s.resize(n + 2);
  int si, sj, ei, ej;
	cin >> si >> sj >> ei >> ej;
  for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			cin >> v[i][j];
			s[i].insert(j);
			dp[i][j] = 1e9;
		}
	}
	dp[si][sj] = 0;
	s[si].erase(sj);
	q.push({si, sj});
	flood_fill(si, sj, 0);
	while(!q.empty()) {
		auto [a, b] = q.front();
		q.pop();
		if(a == ei && b == ej) {
			cout << dp[a][b];
			return 0;
		}
		// deci mergem (a - d, b - d) -> (a + d, b + d) 
		// fara colturi
		int p1 = b - d, p2 = b + d, aux;
		for(int i = max(1, a - d); i <= min(n, a + d); i++) {
			if(i == a - d || i == a + d) {
				p1++, p2--;
			}
			auto it = s[i].lower_bound(p1);
			vector<int> de;
			while(it != s[i].end() && *it <= p2) {
				aux = *it;
				dp[i][aux] = dp[a][b] + 1;
				q.push({i, aux});
				de.push_back(aux);
				it++;
				s[i].erase(aux);
			}
			for(auto ip : de) {
				for(int dir = 0; dir < 4; dir++) {
					int ii = i + dx[dir];
					int jj = ip + dy[dir];
					if(v[ii][jj] == '.' && s[ii].find(jj) != s[ii].end()) {
						// continue;
						s[ii].erase(jj);
						dp[ii][jj] = dp[i][ip];
						q.push({ii, jj});
						flood_fill(ii, jj, dp[ii][jj]);
					}
				}
				if(v[i][ip] == '.' && s[i].find(ip) != s[i].end()) {
					s[i].erase(ip);
					flood_fill(i, ip, dp[i][ip]);
				}
			}
			if(i == a - d || i == a + d) {
				p1--, p2++;
			}
		}
	}
	assert(0);
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...