Submission #1225627

#TimeUsernameProblemLanguageResultExecution timeMemory
1225627TadijaSebezMaze (JOI23_ho_t3)C++20
100 / 100
585 ms235248 KiB
#include <bits/stdc++.h>
using namespace std;

const int N=6000050;
const int inf=1e9+7;
char s[N];
int mv[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int main(){
    int n,m,k;
    scanf("%i %i %i",&n,&m,&k);
    int sx,sy;
    scanf("%i %i",&sx,&sy);
    int gx,gy;
    scanf("%i %i",&gx,&gy);
    vector<vector<int>> mat(n+1,vector<int>(m+1,inf));
    auto dist=mat;
    vector<vector<array<int,2>>> go(n+1,vector<array<int,2>>(m+1,{0,0}));
    for(int i=1;i<=n;i++){
        scanf("%s",s+1);
        for(int j=1;j<=m;j++){
            mat[i][j]=s[j]=='#';
        }
    }
    auto Valid=[&](int x,int y){
        return x>=1 && x<=n && y>=1 && y<=m;
    };
    queue<pair<int,int>> q[2];
    int now=0,pre=1;
    q[now].push({sx,sy});
    dist[sx][sy]=0;
    while(q[now].size()){
        for(int dir=0;dir<2;dir++){
            queue<pair<int,int>> all;
            while(q[now].size()){
                int x,y;tie(x,y)=q[now].front();
                q[now].pop();
                all.push({x,y});
                if(go[x][y][dir]>0){
                    for(int d=dir;d<4;d+=2){
                        int nx=x+mv[d][0];
                        int ny=y+mv[d][1];
                        if(Valid(nx,ny)&&dist[nx][ny]==inf){
                            dist[nx][ny]=dist[x][y];
                            q[now].push({nx,ny});
                            go[nx][ny]=go[x][y];
                            go[nx][ny][dir]--;
                        }
                    }
                }
            }
            q[now]=all;
        }
        while(q[now].size()){
            int x,y;tie(x,y)=q[now].front();
            q[now].pop();
            for(int d=0;d<4;d++){
                int nx=x+mv[d][0];
                int ny=y+mv[d][1];
                if(Valid(nx,ny)&&dist[nx][ny]==inf){
                    if(mat[nx][ny]){
                        dist[nx][ny]=dist[x][y]+1;
                        q[pre].push({nx,ny});
                        go[nx][ny]={k-1,k-1};
                    }else{
                        dist[nx][ny]=dist[x][y];
                        q[now].push({nx,ny});
                    }
                }
            }
        }
        swap(now,pre);
    }
    printf("%i\n",dist[gx][gy]);
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:10:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   10 |     scanf("%i %i %i",&n,&m,&k);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~
Main.cpp:12:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |     scanf("%i %i",&sx,&sy);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:14:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   14 |     scanf("%i %i",&gx,&gy);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:19:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |         scanf("%s",s+1);
      |         ~~~~~^~~~~~~~~~
#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...