2665번 - 미로만들기
오랜만에 문제를 풀어보니까 머리가 굳은 거 같다.
문제를 처음에 너무 어렵게 생각해서 '벽부시고 이동하기' 와 같이 차원을 늘린 bfs를 사용하려고 고민했었다.
하지만 그냥 단순한 BFS에 조건만 추가해서 문제를 풀 수 있었다.
기본적으로 모든 map 의 값을 INF 로 지정된 큰 수를 저장한다. 그리고 BFS에서 4가지 방향을 보면서 조건문으로 나보다 적은 횟수로 이동가
능한 점을 큐에 넣는다. 즉 0,0 에서는 벽을 길로 바꿀 필요없이 이동가능하므로 dist 값을 0 으로 갖는다. 하지만 만약 0,1 이 벽이라면 0,1 까
지 가는 방법은 벽을 1번 바꾼값이 된다. 따라서 0,0 까지 가는 벽을 바꾸는 방법의 수 + 1이 된다.
이런식으로 나보다 작은 값으로 바꾸면서 이동하면 끝점까지 최소로 바꾸면서 도착하는 값을 구할 수 있다.
<정답 코드>
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include<iostream> #include<queue> using namespace std; #define INF 987654321; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int n; int map[51][51]; int dist[51][51]; void init() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { dist[i][j]=INF; } } } void bfs() { queue<pair<int,int>> q; q.push(make_pair(0,0)); dist[0][0]=0; while(!q.empty()) { int x=q.front().first; int y=q.front().second; q.pop(); for(int d=0;d<4;d++) { int nx=x+dx[d]; int ny=y+dy[d]; if(nx>=0 && ny>=0 && nx<n && ny<n && dist[x][y]<dist[nx][ny]) { if(map[nx][ny]==0) dist[nx][ny]=dist[x][y]+1; else dist[nx][ny]=dist[x][y]; q.push(make_pair(nx,ny)); } } } cout<<dist[n-1][n-1]<<endl; } int main() { //freopen("input.txt","r",stdin); // 입력 cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { char tmp; cin>>tmp; map[i][j]=tmp-'0'; } } // 초기화 init(); // bfs bfs(); return 0; } | cs |
반응형