코테연습일지/그래프 이론
14923 미로 탈출
jemin0619
2024. 3. 2. 16:39
https://www.acmicpc.net/problem/14923
14923번: 미로 탈출
홍익이는 사악한 마법사의 꾐에 속아 N x M 미로 (Hx, Hy) 위치에 떨어졌다. 다행히도 홍익이는 마법사가 만든 미로의 탈출 위치(Ex, Ey)를 알고 있다. 하지만 미로에는 곳곳에 마법사가 설치한 벽이
www.acmicpc.net
벽 부수고 이동하기와 유사한 문제였다. 간만에 풀어보았는데 좋은 연습이 되었다. 실수로 board에 z축을 추가해서 맞왜틀을 했었다...
#include <bits/stdc++.h>
using namespace std;
int board[1003][1003];
int dist[1003][1003][2];
int dy[4]={1,0,-1,0};
int dx[4]={0,1,0,-1};
queue<tuple<int,int,int>> Q;
int n,m,Hx,Hy,Ex,Ey;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>m>>Hy>>Hx>>Ey>>Ex;
Hx--; Hy--; Ex--; Ey--;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>board[i][j];
dist[i][j][0]=-1;
dist[i][j][1]=-1;
}
}
dist[Hy][Hx][0]=0;
Q.push({Hy,Hx,0});
while(!Q.empty()){
auto cur=Q.front(); Q.pop();
int curY,curX,curW; tie(curY,curX,curW)=cur;
int curDist=dist[curY][curX][curW];
//도착했다면 END
if(curY==Ey && curX==Ex){
cout<<curDist<<'\n';
return 0;
}
for(int dir=0;dir<4;dir++){
int ny=curY+dy[dir];
int nx=curX+dx[dir];
int nw=curW;
if(ny<0||nx<0||ny>=n||nx>=m) continue;
//벽을 만났다면 깨고 봄
if(board[ny][nx]==1) nw++;
//벽을 2회 이상 부쉈거나 이미 갔던 곳이면 continue
if(nw>1 || dist[ny][nx][nw]!=-1) continue;
dist[ny][nx][nw]=curDist+1;
Q.push({ny,nx,nw});
}
}
cout<<-1;
return 0;
}