Submission #1284892

#TimeUsernameProblemLanguageResultExecution timeMemory
1284892syanvuMaze (JOI23_ho_t3)C++20
100 / 100
1607 ms110352 KiB
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp> 
// #include <ext/pb_ds/tree_policy.hpp>

#define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
// #pragma optimize("g", on)
// #pragma GCC optimize("03")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,avx2,mmx,fma,avx,tune=native")
// #define int long long
#define all(x) x.begin(),x.end()
#define F first
#define S second


using namespace std;
// using namespace __gnu_pbds; 
// #define ordered_set tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update>

const int LG = 17,N = 2e5+1,inf = 1e9,MOD = 1e9 + 7;
const double eps = 1e-9;
int T;

void solve() {
    int r,c,n;
    cin>>r>>c>>n;
    string s[r];
    int sx,sy,fx,fy;
    cin>>sx>>sy>>fx>>fy;
    sx--,sy--,fx--,fy--;
    for(int i=0;i<r;i++) cin>>s[i];
    priority_queue<array<int,4>,vector<array<int,4>>,greater<array<int,4>>> pq;
    int used[r][c]={};
    pair<int,int> dp[r][c];
    for(int i=0;i<r;i++){
        for(int j=0;j<c;j++) dp[i][j] = {inf,0};
    }
    dp[sx][sy]={0,0};
    pq.push({0,0,sx,sy});
    int dx[8]={0,0,1,-1,1,-1,1,-1},dy[8]={1,-1,0,0,1,1,-1,-1};
    while(pq.size()){
        auto [musor,govno,x,y] = pq.top();
        pq.pop();
        used[x][y]=1;
        for(int i=0;i<8;i++){
            int tox=dx[i] + x, toy=dy[i] + y;
            if(min(tox,toy)<0 || tox>=r || toy>=c) continue;
            if(dp[x][y].S == 0){
                if(i>=4) continue;
                if(s[tox][toy] == '.'){
                    if(dp[tox][toy].F > dp[x][y].F){
                        dp[tox][toy] = {dp[x][y].F, 0};
                        if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy});
                        used[tox][toy]=1;
                    }
                }
                else{
                    if(dp[tox][toy].F >= dp[x][y].F + 1){
                        dp[tox][toy] = {dp[x][y].F + 1, n-1};
                        if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy});
                        used[tox][toy]=1;
                    }
                }
            }
            else if(dp[x][y].S > 0){
                if(dp[tox][toy].F > dp[x][y].F){
                    dp[tox][toy] = {dp[x][y].F, dp[x][y].S-1};
                    if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy});
                    used[tox][toy]=1;
                }
                else if(dp[tox][toy].F == dp[x][y].F && dp[tox][toy].S < dp[x][y].S - 1){
                    dp[tox][toy] = {dp[x][y].F, dp[x][y].S-1};
                    if(!used[tox][toy]) pq.push({dp[tox][toy].F,-dp[tox][toy].S,tox,toy});
                    used[tox][toy]=1;
                }
            }
        }
    }
    cout<<dp[fx][fy].F;
}
signed main() {
    SS
    int t = 1;
    if (T) {
        cin >> t;
    }
    while (t--) {
        solve();
    }
}
#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...