2019 KCPC trap

2019 KCPC 함정에 빠진 이동관 (신입생 부문 E번 / 일반 부문 A번) 코드 제출 url

제가 낸 문제입니다! 숭고한 대회때는 조금 challenging한 문제를 냈던 데 반해 이번에는 조금 well-known한 문제를 만들었습니다. :)

BFS 알고리즘을 이용하면 쉬운 문제입니다. BFS 알고리즘의 특성상 BFS 탐색 한 번으로 가중치가 1인 그래프에서 최단거리와 도달 여부를 모두 알 수 있습니다.

BFS 알고리즘에 대한 설명은 빠른 시일 내로 추가하도록 하겠습니다.

#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
using namespace std;
const int SZ=1005;
int arr[SZ][SZ];
int vst[SZ][SZ];
queue<pair<int,int>> q;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int main(void){
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n,m; cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++) cin>>arr[i][j];
    }
    int x,y; cin>>x>>y;
    memset(vst,-1,sizeof(vst));
    vst[1][1]=0;
    q.push({1,1});
    while(!q.empty()){
        auto h=q.front(); q.pop();
        if(h.ff==x && h.ss==y){
            cout<<vst[x][y];
            return 0;
        }
        for(int i=0;i<4;i++){
            int nx=h.ff+arr[h.ff][h.ss]*dx[i];
            int ny=h.ss+arr[h.ff][h.ss]*dy[i];
            if(nx<1 || nx>n) continue;
            if(ny<1 || ny>m) continue;
            if(vst[nx][ny]!=-1) continue;
            vst[nx][ny]=vst[h.ff][h.ss]+1;
            q.push({nx,ny});
        }
    }
    if(vst[x][y]!=-1) cout<<vst[x][y];
    else cout<<-1;
    return 0;
}