[도전 20일차] 미로 만들기 풀이 - KOI 고등부
2020. 4. 20. 01:35ㆍPS/도전
※복습 :
문제 : 백준 2665 미로 만들기
사용 알고리즘 : BFS
풀이:
시작점에서부터 도착점까지 가면서 색을 바꾸어야 할 검은 방의 최소 개수를 구하는 것이 목표다. 시작점으로부터 탐색을 돌리는데 들고 다닐 것은 지금까지 바꾼 검은 방의 개수다. visited 배열에 바꾼 검은 방 개수를 저장하면서 만약 개수가 작으면 갱신하고, 크거나 같으면 무시하면 된다. 이떄 DFS, BFS 모두 가능하다.
safe 함수를 써서 인덱스가 맞는 지 확인하는 것이 은근 편하다. 참고하자.
bool safe(int a,int b){
return a>=0&&a<n&&b>=0&&b<n;
}
코드
더보기
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
|
//pentagon@sasa.hs.kr
#include<bits/stdc++.h>
const int INF = 1e9;
using namespace std;
int n,arr[51][51],v[51][51],dr[4]={1,0,-1,0},dc[4]={0,1,0,-1};
inline bool safe(int a,int b){
return a>=0&&a<n&&b>=0&&b<n;
}
void bfs(int s1,int s2){
queue<tuple<int,int,int>> q;
q.push(make_tuple(s1,s2,0));
while(!q.empty()){
int x,y,d;
tie(x,y,d)=q.front(); q.pop();
for(int i=0;i<4;i++){
int r=x+dr[i],c=y+dc[i];
if(!safe(r,c)) continue;
d+=!arr[r][c];
if(d<v[r][c]){
v[r][c]=d;
q.push(make_tuple(r,c,d));
}
d-=!arr[r][c];
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
scanf("%1d",&arr[i][j]);
v[i][j]=INF;
}
bfs(0,0);
printf("%d",v[n-1][n-1]);
}
|
cs |
궁금한 점이 있으시다면 질문 남겨주세요 :)
728x90
'PS > 도전' 카테고리의 다른 글
[도전 22일차] 로봇 - KOI 고등부 풀이 (0) | 2020.04.22 |
---|---|
[도전 21일차] 통나무 옮기기 - KOI 고등부 풀이 (2) | 2020.04.21 |
[도전 19일차] KOI 벽장문의 이동 풀이 (0) | 2020.04.20 |
[도전 18일차] 로봇 조종하기 - KOI 고등부 풀이 (0) | 2020.04.18 |
[도전 17일차] 숫자 박스 - KOI 고등부 풀이 (0) | 2020.04.17 |