티스토리 뷰

반응형

 

www.acmicpc.net/problem/14923

 

14923번: 미로 탈출

홍익이는 사악한 마법사의 꾐에 속아 N x M 미로 (Hx, Hy) 위치에 떨어졌다. 다행히도 홍익이는 마법사가 만든 미로의 탈출 위치(Ex, Ey)를 알고 있다. 하지만 미로에는 곳곳에 마법사가 설치한 벽이

www.acmicpc.net

최단경로를 찾는 문제입니다.

벽을 1회만 통과할 수 있는데 이러한 경우 방문처리 배열크기를 늘리지 않고 풀 수 있는 방법이 있습니다.

시작점에서부터 도착점까지 BFS를 수행하여 얻은 최단거리 정보 bfs와 (코드에서 bfs배열)

도착점에서부터 시작점까지 BFS를 수행하여 얻은 최단거리 정보 rbfs를 구한 후

특정 위치(i,j) 에서 bfs[i][j] + rbfs[i][j] 의 최소값을 구하면 단순 BFS를 이용하여 쉽게 답을 구해낼 수 있습니다.

 

벽을 한번만 통과할 수 있으므로, 시작점에서 출발한 A와 도착점에서 출발한 B가 만났을때 둘의 거리합의 최소를 구한다고 생각하면 쉽습니다 (벽까지의 최단거리를 포함)

 

비슷한 문제로는 백준 14948번 군대탈출하기가 있습니다.

 

 

  • C++ 전체 코드
#include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; int N,M; int sty, stx, edy, edx; int m[1001][1001]{}; int bfs[1001][1001]{}; int rbfs[1001][1001]{}; int dy[4] = {-1,1,0,0}; int dx[4] = {0,0,-1,1}; void solve(int sty, int stx, int edy, int edx, int vi[][1001]){ ​​​​queue<tuple<int,int,int>> q; ​​​​q.push({0,sty,stx}); ​​​​vi[sty][stx] = 0; ​​​​while(!q.empty()){ ​​​​​​​​int cd, cy, cx; ​​​​​​​​tie(cd, cy, cx) = q.front(); ​​​​​​​​q.pop(); ​​​​​​​​for(int i=0; i<4; i++){ ​​​​​​​​​​​​int ny = cy + dy[i]; ​​​​​​​​​​​​int nx = cx + dx[i]; ​​​​​​​​​​​​if(ny<0 || nx<0 || ny>=N || nx>=M || vi[ny][nx]!=-1) continue; ​​​​​​​​​​​​// 벽을 만나면 더이상 나아갈 수 없으므로 push하지 않음 ​​​​​​​​​​​​if(m[ny][nx]==0) q.push({cd+1, ny, nx}); ​​​​​​​​​​​​// 벽까지의 최단거리는 필요함 ​​​​​​​​​​​​vi[ny][nx] = cd+1; ​​​​​​​​} ​​​​} } int main() { ​​​​ios_base::sync_with_stdio(0); ​​​​cin.tie(0); ​​​​cin>>N>>M; ​​​​cin>>sty>>stx>>edy>>edx; ​​​​sty--; stx--; edy--; edx--; ​​​​for(int i=0; i<N; i++){ ​​​​​​​​for(int j=0; j<M; j++){ ​​​​​​​​​​​​cin>>m[i][j]; ​​​​​​​​} ​​​​} ​​​​ ​​​​memset(bfs,-1,sizeof(bfs)); ​​​​memset(rbfs,-1,sizeof(rbfs)); ​​​​solve(sty, stx, edy, edx, bfs); ​​​​solve(edy, edx, sty, stx, rbfs); ​​​​ ​​​​int ans = INF; ​​​​for(int i=0; i<N; i++){ ​​​​​​​​for(int j=0; j<M; j++){ ​​​​​​​​​​​​if(bfs[i][j]!=-1 && rbfs[i][j]!=-1){ ​​​​​​​​​​​​​​​​ans = min(ans, bfs[i][j] + rbfs[i][j]); ​​​​​​​​​​​​} ​​​​​​​​} ​​​​} ​​​​if(ans == INF) cout<<-1; ​​​​else cout<<ans; }
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함