Submission #1314839

#TimeUsernameProblemLanguageResultExecution timeMemory
1314839WH8Maze (JOI23_ho_t3)C++20
100 / 100
913 ms246124 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pll pair<long long, long long> #define mp make_pair #define pb push_back #define f first #define s second #define endl '\n' #define ld long double #define sz(x) static_cast<int>((x).size()) #define i5 tuple<int,int,int,int,int> #define all(x) x.begin(), x.end() #define iiii tuple<int, int,int,int> signed main(){ int r, c, n;cin>>r>>c>>n; int sr,sc,gr,gc;cin>>sr>>sc>>gr>>gc; vector<vector<bool>> mat(r+2, vector<bool>(c+2, 0)), vis0(r+2, vector<bool>(c+2, 0)), vis1(r+2, vector<bool>(c+2, 0)); vector<vector<int>> d(r+2, vector<int>(c+2, -1)); for(int i=1;i<=r;i++){ for(int j=1;j<=c;j++){ char c;cin>>c; if(c=='.')mat[i][j]=1; } } vector<pll> cur; cur.pb({sr, sc}); d[sr][sc]=0; int dir[4][2]={{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; auto out=[&](int x, int y)->bool{return ((x < 1) or (x > r) or (y < 1) or (y > c));}; int cd=0; while(!cur.empty()){ vector<pll> b; // do 0-1 bfs from every cell in b for (auto [x, y] : cur){ queue<pll> q; q.push({x, y}); vis0[x][y]=true; while(!q.empty()){ auto [i, j] = q.front(); q.pop(); //printf("%lld %lld \n", i, j); for(int k=0;k<4;k++){ int di=dir[k][0], dj=dir[k][1]; int ni=i+di, nj=j+dj; //printf("di %lld dj %lld, ni %lld nj %lld\n", di, dj, ni, nj); if (out(ni, nj) or vis0[ni][nj]){ continue; } if (!mat[ni][nj]) { b.pb({ni, nj}); d[ni][nj]=d[i][j]+1; } else { q.push({ni, nj}); d[ni][nj]=d[i][j]; } vis0[ni][nj]=true; } } } /*printf("cd %lld, border cells are \n", cd); for(auto [i, j] : b){ printf("(%lld, %lld) ", i, j); } cout<<endl;*/ for(int k=0;k<4;k++){ int di=dir[k][0], dj=dir[k][1]; vector<pll> nw, lay=b; for(int t=0;t<n-1;t++){ vector<pll> nxtlay; for(auto [i, j] : lay){ int ni=i+di, nj=j+dj; if(out(ni, nj) or vis0[ni][nj])continue; vis0[ni][nj]=true; d[ni][nj]=cd+1; nw.pb({ni, nj}); nxtlay.pb({ni, nj}); } swap(nxtlay, lay); } b.insert(b.end(),all(nw)); } swap(cur, b); cd++; } cout<<d[gr][gc]; }
#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...