일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 알고리즘
- 자바의정석
- BFS
- 백준9단계
- 동적계획법
- 자바공부
- ☆
- 백준자바
- 코딩공부
- 무료코딩강의
- dp
- 다이나믹 프로그래밍
- java
- 무료개발강의
- Java개념
- 백준단계별로풀어보기
- 자바의정석연습문제풀이
- 백준
- dfs
- 브루트포스
- 백준알고리즘
- 시간 복잡도
- 백트래킹
- 빅오 표기법
- 자바의정석연습문제
- 개발공부
- 알고리즘공부
- ★
- 자바개념
- Today
- Total
더 많이 실패하기
공부 187일차: 백준 2178번 미로 탐색 자바 java 본문
2178 미로 탐색
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
백준 2178번 문제 미로 탐색
문제
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 192 MB | 148102 | 64540 | 41419 | 42.273% |
문제
N×M크기의 배열로 표현되는 미로가 있다.
1 | 0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 |
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
예제 입력 1
4 6
101111
101010
101011
111011
예제 출력 1
15
예제 입력 2
4 6
110110
110110
111111
111101
예제 출력 2
9
예제 입력 3
2 25
1011101110111011101110111
1110111011101110111011101
예제 출력 3
38
예제 입력 4
7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111
예제 출력 4
13
과정 생각해보기 & 오답
최단거리, 최솟값 => BFS
https://gimbalja.tistory.com/327
깊이 우선 탐색 DFS와 너비 우선 탐색 BFS
DFS와 BFS란? DFS는 Depth-First Search, 깊이 우선 탐색 BFS는 Breadth-First Search, 너비 우선 탐색이다 그림에서 보듯이 직관적으로 말하면 아래로 먼저 가는지, 옆으로 먼저 가는지에 따라 구분된다고 할 수
gimbalja.tistory.com
DFS와 BFS는 위의 글을 참고
이 블로그에서 힌트를 얻었다
1 | 9 | 10 | 11 | 12 | |
2 | 8 | 12 | |||
3 | 7 | 13 | 14 | ||
4 | 5 | 6 | 14 | 15 |
이렇게 누적하는 방법을 쓸 것이기 때문에 방문 여부를 표시하는 boolean[]은 필요하지 않다
정답 인정 코드
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
|
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n, m;
static int[][] matrix;
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, -1, 0, 1};
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
matrix = new int[n][m];
for(int i = 0; i < n; i++) {
String str = br.readLine();
for(int j = 0; j < m; j++) {
matrix[i][j] = str.charAt(j)-'0';
}
}
BFS(0, 0);
bw.write(matrix[n-1][m-1]+"");
bw.flush();
bw.close();
}
static void BFS(int x, int y) {
Queue<Node> q = new LinkedList<>();
q.add(new Node(x, y));
while(!q.isEmpty()) {
Node next = q.poll();
for(int i = 0; i < 4; i++) { // 상하좌우
int X = next.x + dx[i];
int Y = next.y + dy[i];
if(X > -1 && X < n && Y > -1 && Y < m) { // 범위 안
if(matrix[X][Y] == 1) { // 1이 아니다 == 0이거나 아직 더해지지 않았다 == 방문하지 않음
q.add(new Node(X, Y));
matrix[X][Y] = matrix[next.x][next.y]+1;
}
}
}
}
}
static class Node{
int x, y;
public Node(int x, int y){
this.x = x;
this.y = y;
}
}
}
|
cs |
'알고리즘 > 백준' 카테고리의 다른 글
공부 189일차: 백준 7562번 나이트의 이동 자바 java (0) | 2023.02.04 |
---|---|
공부 188일차: 백준 7576번 토마토 자바 java (0) | 2023.02.03 |
공부 186일차: 백준 4963번 섬의 개수 자바 java (0) | 2023.02.01 |
공부 185일차: 백준 2667번 단지번호붙이기 자바 java (0) | 2023.01.31 |
공부 184일차: 백준 1707번 이분 그래프 자바 java (0) | 2023.01.30 |