티스토리 뷰
[문제]
https://www.acmicpc.net/problem/2206
[처음 생각]
https://www.acmicpc.net/problem/2178
보자마자 이 문제인줄 알았다. 대신 이 문제에서 벽을 한번 부술 수 있다는 기회가 있다는 점이 차이점이었다.
벽을 한번 부술 수 있는 대신에 가장 최단으로 갈 수 있는 거리를 찾아야 한다. 내가 소스를 짜봤을 때는 탐색하는 다음 방향의 블럭이 0일 때와 1일 때로 나눠서 생각했다. 그리고 그 안에서 전의 블럭(바로 큐에서 꺼낸 블럭)이 벽을 뚫고 온 상태인지 아닌지를 체크하며 벽을 뚫는 횟수 변수인 wall을 사용할 예정이었다.
[풀이]
결국 소스를 참고 했는데...
내가 생각한 것처럼 다음 방향의 블럭이 0일 때와 1일 때로 나눠서 하는건 맞았다. 대신 visited배열을 2차원이 아닌, 3차원 배열로 만들어서 벽을 뚫고 왔는지(1) 아닌지(0)를 같이 체크할 수 있도록 했다. 그리고 3차원 배열을 Integer.MAX_VALUE로 초기화해서 나중에 방문을 체크하도록 했다.
[다른 풀이]
Data라는 클래스에 변수로 x, y, 지나치는 블럭을 세는 depth, 벽을 뚫는 스킬을 썼는지 여부의 skill(1이면 쓴것)을 만듦
result 전역변수 선언
visited[][][skill여부] 선언
<main 함수>
//어짜피 여기서 인덱스 1부터 n과 m까지 사용할거라서 인덱스 0부터인지 1부터인지 중요 ㄴㄴ
기본 map을 -1로 초기화
visited는 0으로 초기화
map을 인덱스 1부터 n과 m까지 입력받음
//1,1을 시작으로 시작칸 포함해서 1의 depth와 skill 안씀
BFS(1, 1, 1, 0) 호출
result가 0이면 -1 출력
아니면 result 출력
<BFS 함수>
//매개변수(x, y, depth, skill)
큐에 Data 객체로 매개변수로 들어온것들 넣음
while(!qu.isEmpty())
{
Data temp = qu.remove();
//map 범위 체크
//map 벗어나는지 체크(-1인지)
//이미 방문했는지 체크
////아니라면 방문처리
//만약 현재 좌표가 목표지점인 (n,m)이면 result에 temp.depth 넣고 return
for(int i = 0; i<4; i++)
{
//다음 위치의 좌표 계산한 nx, ny
if(map[nx][ny]==0) 안막혔으면
큐에 Data(nx, ny, temp.depth+1, temp.skill) 넣음
막혔으면서 스킬을 아직 안썼다면
큐에 Data(nx, ny, temp.depth+1, 1) 넣음. skill 써서 1
}
}
https://gist.github.com/dbwls94/e9f1a7bc00464c875a46009fda1f6248
[Code]
https://github.com/dbwls94/gomulsang/blob/youjin/BOJ/src/boj_2206/BreakingWall.java
'BOJ > BFS, DFS' 카테고리의 다른 글
BOJ/2468_안전 영역 (0) | 2017.04.13 |
---|---|
BOJ/13460_째로탈출2 (0) | 2017.03.23 |
BOJ/7569_토마토2 (0) | 2017.03.13 |
BOJ/7576_토마토 (0) | 2017.03.13 |
BOJ/2178_미로 찾기 (0) | 2017.02.13 |
- Total
- Today
- Yesterday
- 7569
- 2048 game
- 1037
- 1085
- 1157
- 12100
- mybatis
- 파라메트릭
- 약수
- 위상정렬
- 13460
- 이진 검색
- combination
- spring
- 단어 공부
- 이진 탐색
- 7576
- ACM Craft
- BOJ
- 자료구조
- 조합 알고리즘
- acmpicpc
- 알파벳 찾기
- lottie
- 째로탈출2
- acmicpc
- 10809
- parametric search
- Java
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |