Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int dr[4] = {-1, 0, 1, 0};
- const int dc[4] = {0, 1, 0, -1};
- const int MAXN = 1010;
- int n, D;
- bool wall[MAXN][MAXN];
- int dist[MAXN][MAXN];
- int firstiter[MAXN][MAXN];
- bool vis[MAXN][MAXN][2];
- bool vis2[MAXN][MAXN];
- vector<pair<int, int>> queues[MAXN];
- //vector<vector<bool>> wall, vis2;
- //vector<vector<int>> dist, firstiter;
- //vector<vector<pair<int, int>>> queues;
- int main() {
- cin.tie(0)->sync_with_stdio(false);
- // #ifndef _DEBUG
- // freopen("dream.in", "r", stdin);
- // freopen("dream.out", "w", stdout);
- // #endif
- // wall.assign(MAXN, vector<bool>(MAXN));
- // dist.assign(MAXN, vector<int>(MAXN));
- // firstiter.assign(MAXN, vector<int>(MAXN));
- // vis2.assign(MAXN, vector<bool>(MAXN));
- // queues.assign(MAXN, vector<pair<int, int>>());
- cin >> n >> D;
- queue<pair<int, int>> q;
- queue<tuple<int, int, int>> q2;
- for (int r = 1; r <= n; ++r) {
- for (int c = 1; c <= n; ++c) {
- dist[r][c] = -1;
- vis[r][c][0] = vis[r][c][1] = false;
- firstiter[r][c] = -1;
- char ch;
- cin >> ch;
- if (ch == 'S') {
- ch = '.';
- q2.emplace(r, c, 0);
- vis[r][c][0] = true;
- }
- if (ch == '.') {
- wall[r][c] = false;
- } else {
- wall[r][c] = true;
- q.emplace(r, c);
- dist[r][c] = 0;
- }
- }
- }
- while (!q.empty()) {
- int r, c;
- tie(r, c) = q.front();
- q.pop();
- for (int dir = 0; dir < 4; ++dir) {
- int r1 = r + dr[dir];
- int c1 = c + dc[dir];
- if (dist[r1][c1] == -1) {
- dist[r1][c1] = dist[r][c] + 1;
- q.emplace(r1, c1);
- }
- }
- }
- while (!q2.empty()) {
- int r, c, t;
- tie(r, c, t) = q2.front();
- q2.pop();
- int par = t % 2;
- int iter = t / D;
- firstiter[r][c] = iter;
- if (t > 0 && t % D == 0) {
- // expand
- if (iter >= dist[r][c]) {
- // no space
- firstiter[r][c] = iter-1; // before expanding
- continue;
- }
- }
- for (int dir = 0; dir < 4; ++dir) {
- int r1 = r + dr[dir];
- int c1 = c + dc[dir];
- if (wall[r1][c1] || vis[r1][c1][1-par]) continue;
- if (iter >= dist[r1][c1]) continue;
- vis[r1][c1][1-par] = true;
- q2.emplace(r1, c1, t+1);
- }
- }
- // static int PAPA[MAXN][MAXN];
- int dpar = D % 2;
- for (int r = 1; r <= n; ++r) {
- for (int c = 1; c <= n; ++c) {
- vis2[r][c] = false;
- int maxiter = -1;
- if (vis[r][c][dpar]) {
- maxiter = max(maxiter, firstiter[r][c]);
- int x = dist[r][c]-1;
- for (int dir = 0; dir < 4; ++dir) {
- int r1 = r + dc[dir];
- int c1 = c + dc[dir];
- if (!vis[r1][c1][1-dpar]) continue;
- int x1 = dist[r1][c1]-1;
- maxiter = max(maxiter, min(x, x1+1));
- }
- }
- if (vis[r][c][1-dpar]) {
- maxiter = max(maxiter, firstiter[r][c]);
- for (int dir = 0; dir < 4; ++dir) {
- int r1 = r + dc[dir];
- int c1 = c + dc[dir];
- if (!vis[r1][c1][dpar]) continue;
- int x1 = dist[r1][c1]-1;
- maxiter = max(maxiter, x1);
- }
- }
- if (maxiter >= 0) {
- queues[maxiter].emplace_back(r, c);
- }
- // PAPA[r][c]=maxiter;
- }
- }
- int ans = 0;
- for (int iter = n; iter >= 0; --iter) {
- for (auto& cell : queues[iter]) {
- int r, c;
- tie(r, c) = cell;
- if (vis2[r][c]) continue;
- vis2[r][c] = true;
- ++ans; // #vis2
- if (iter == 0) continue;
- for (int dir = 0; dir < 4; ++dir) {
- int r1 = r + dr[dir];
- int c1 = c + dc[dir];
- if (!wall[r1][c1] && !vis2[r1][c1]) {
- queues[iter-1].emplace_back(r1, c1);
- }
- }
- }
- }
- cout << ans << '\n';
- // cout<<"vis:\n";
- // for (int r = 1; r <= n; ++r) {
- // for (int c = 1; c <= n ; ++c) {
- // if (wall[r][c]) cout<<"#";
- // else if (vis2[r][c]) cout << "x";
- // else cout << ".";
- // }
- // cout<<"\n";
- // }
- // cout<<"dist:\n";
- // for (int r = 1; r <= n; ++r) {
- // for (int c = 1; c <= n; ++c) {
- // cout<<dist[r][c];
- // }
- // cout<<"\n";
- // }
- // cout<<"visparity:\n";
- // for (int r = 1; r <= n; ++r) {
- // for (int c = 1; c <= n; ++c) {
- // if(wall[r][c])cout<<"#";
- // else if (vis[r][c][0]&&vis[r][c][1])cout<<"2";
- // else if (vis[r][c][0])cout<<"0";
- // else if (vis[r][c][1])cout<<"1";
- // else cout<<".";;
- // }
- // cout<<"\n";
- // }
- // cout<<"maxiter:\n";
- // for (int r = 1; r <= n; ++r) {
- // for (int c = 1; c <= n; ++c) {
- // if(wall[r][c])cout<<"#";
- // else if (PAPA[r][c]==-1) cout << ".";
- // else cout<<PAPA[r][c];
- // }
- // cout<<"\n";
- // }
- // cout<<"firstiter:\n";
- // for (int r = 1; r <= n; ++r) {
- // for (int c = 1; c <= n; ++c) {
- // if(wall[r][c])cout<<"#";
- // else if (firstiter[r][c]==-1) cout << ".";
- // else cout<<firstiter[r][c];
- // }
- // cout<<"\n";
- // }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement