Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 시뮬레이션
- 이젠 골드구현도 어렵네..
- 백준코딩테스트
- COSPROJAVA1급
- 재귀함수
- DFS
- 자바PS
- 다익스트라
- QUICKSTARTGUIDE
- 구현
- 백준
- 세그먼트트리
- 취득후기
- BFS
- 01BFS
- 완전탐색
- 엘라스틱서치
- COSPRO
- 게더타운시작
- 알고리즘
- 우선순위큐
- dp
- 네트워크플로우
- 다이나믹프로그래밍
- PS
- GatherTown
- java
- spring
- YBMCOS
- deque
Archives
- Today
- Total
공부공간
BOJ - 25307 ) 시루의 백화점 구경 본문
https://www.acmicpc.net/problem/25307
첫 시작점으로 부터 목적지(2) 까지 갈 수 있는지 확인한다 (bfs)
탐색전 마네킹거리(K, 마네킹 좌표에서 bfs로 k번이동하여 갈수있는곳)를 불가능 표시를 해두고
한번만 BFS를 진행하면 해결된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class BOJ_25307 {
public static boolean inRange(int yy, int xx, int n , int m) {return yy<n&&xx<m&&yy>=0&&xx>=0;}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
ArrayDeque<int[]> dq = new ArrayDeque<>();
ArrayList<int[]> node = new ArrayList<>();
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int dir[][] = {{1,0},{-1,0},{0,1},{0,-1}};
int map[][] = new int[n][m];
int sx= 0;
int sy= 0;
int ex= -987654321;
int ey= -987654321;
for(int i=0;i<n;++i) {
st = new StringTokenizer(br.readLine());
for(int j=0;j<m;++j) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] ==4) {sx=j;sy=i;}
if(map[i][j] ==2) {ex=j;ey=i;}
if(map[i][j] ==3) {node.add(new int[] {i,j});
}
}
}
int size = node.size();
for(int aa=0;aa<size;aa++) {
int i = node.get(aa)[0];
int j = node.get(aa)[1];
dq.add(new int[] {i,j});
map[i][j]=1;
while(!dq.isEmpty()) {
int now[] =dq.poll();
for(int a=0;a<4;a++) {
int nexty=now[0]+dir[a][0];
int nextx=now[1]+dir[a][1];
if(inRange(nexty,nextx,n,m)&&map[nexty][nextx]!=1&&dist(nexty,nextx,i,j,k)) {
map[nexty][nextx]=1;
dq.add(new int[] {nexty,nextx});
}
}
}
}
int answer= 987654321;
dq.add(new int[] {sy,sx,0});
map[sy][sx] = 5;
top:
while(!dq.isEmpty()) {
int now[] = dq.poll();
for(int a=0;a<4;a++) {
int nexty=now[0]+dir[a][0];
int nextx=now[1]+dir[a][1];
if(inRange(nexty,nextx,n,m)
&&map[nexty][nextx]<5
&&map[nexty][nextx]!=1
) {
if(map[nexty][nextx]==2) {
answer = answer > now[2]+1 ? now[2]+1 : answer;
break top;
}
dq.add(new int[] {nexty,nextx,now[2]+1});
map[nexty][nextx]=5;
}
}
}
System.out.println( answer==987654321 ? -1 : answer );
}
private static boolean dist(int nexty, int nextx, int i, int j, int k) {
return (Math.abs(nextx-j)+Math.abs(nexty-i)) <=k;
}
}
'알고리즘 > 완전탐색(BFS,DFS)' 카테고리의 다른 글
BOJ - 1525 ) 퍼즐 (0) | 2022.06.25 |
---|---|
BOJ_16928 ) 뱀과 사다리 게임 (1) | 2022.03.11 |
BOJ - 23747 ) 와드 (0) | 2022.01.25 |
BOJ - 13463 ) Brexit (0) | 2022.01.19 |
BOJ - 1584 ) 게임 (0) | 2021.10.17 |
Comments