Written by
Sunwoo Han
on
on
[JAVA]미로 탐색
미로 탐색
코드
import java.io.*;
import java.util.*;
class node { // x y 좌표 저장 클래스
int x;
int y;
public node(int x,int y) {
this.x = x;
this.y = y;
}
}
public class Main {
static int map[][]; // 2차원 미로 배열
static int check[][]; // 2차원 방문여부 배열
static int cnt = 1; // 시작점을 포함하기 때문에 1로 초기화
static int n, m;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
check = new int[n][m];
for(int i = 0; i < n; i++) { // 줄 단위 값을 저장
String row = br.readLine();
for(int j = 0; j < m; j++) {
map[i][j] = row.charAt(j) - '0';
}
}
bfs(1, 1); // 시작점 전달
System.out.println(check[n - 1][m - 1]); // 방문배열의 마지막 원소 도착지점의 값을 반환
}
public static void bfs(int a, int b) {
Queue<node> queue = new LinkedList<>();
a -= 1; // 시작점이 (1, 1)로 들어오므로 -1
b -= 1;
check[a][b] = cnt; // 방문배열에서 시작점 저장
queue.offer(new node(a, b)); // 시작점 객체를 큐에 삽입
while(!queue.isEmpty()) {
int x = queue.peek().x; // 큐에 저장되어 있는 객체에서 x,y좌표를 저장
int y = queue.peek().y;
queue.poll(); // 해당 객체 소멸
if(y < map[x].length - 1 && map[x][y] == 1
&& map[x][y + 1] == 1 && check[x][y + 1] == 0) {
check[x][y + 1] = check[x][y] + 1; // 현재 경로값을 인접한 방문배열에 저장
queue.offer(new node(x, y + 1)); // 인접한 점을 큐에 저장
}
if(x < map.length - 1 && map[x][y] == 1
&& map[x + 1][y] == 1 && check[x + 1][y] == 0) {
check[x + 1][y] = check[x][y] + 1;
queue.offer(new node(x + 1, y));
}
if(x > 0 && map[x][y] == 1 && map[x - 1][y] == 1 && check[x - 1][y] == 0) {
check[x - 1][y] = check[x][y] + 1;
queue.offer(new node(x - 1, y));
}
if(y > 0 && map[x][y] == 1 && map[x][y - 1] ==1 && check[x][y - 1] == 0) {
check[x][y - 1] = check[x][y] + 1;
queue.offer(new node(x, y - 1));
}
}
}
}
설명
Comments
ALGORITHM 의 다른 글
-
[JAVA]1037. 약수 04 Jan 2021
-
[JAVA]1018. 체스판 다시 칠하기 04 Jan 2021
-
[JAVA]1010. 다리 놓기 04 Jan 2021
-
[JAVA]7576. 토마토 05 Dec 2020
-
[JAVA]1697. 숨바꼭질 04 Dec 2020
-
[JAVA]5337. 웰컴 03 Dec 2020
-
[JAVA]5217. 쌍의 합 03 Dec 2020
-
[JAVA]4892. 숫자 맞추기 게임 03 Dec 2020
-
[JAVA]4101. 크냐? 02 Dec 2020
-
[JAVA]2558. A+B - 2 02 Dec 2020
-
[JAVA]1550. 16진수 02 Dec 2020
-
[JAVA]압축 25 Oct 2020
-
[JAVA]빗물 25 Oct 2020
-
[JAVA]유기농 배추 22 Oct 2020
-
[JAVA]미로 탐색 21 Oct 2020
-
[JAVA]옥상 정원 꾸미기 08 Oct 2020
-
[JAVA]탑 08 Oct 2020
-
[JAVA]안정적인 문자열 07 Oct 2020
-
[JAVA]균형잡힌 세상 07 Oct 2020
-
[JAVA]괄호의 값 06 Oct 2020
-
[JAVA]쇠막대기 06 Oct 2020
-
[JAVA]카드2 05 Oct 2020
-
[JAVA]큐 2 05 Oct 2020
-
[JAVA]제로 05 Oct 2020
-
[JAVA]괄호 04 Oct 2020
-
[JAVA]AC 04 Oct 2020
-
[JAVA]회전하는 큐 04 Oct 2020
-
[JAVA]스택 수열 04 Oct 2020
-
[JAVA]덱 03 Oct 2020
-
[JAVA]큐 03 Oct 2020
-
[JAVA]스택 03 Oct 2020
-
[JAVA]애너그램 만들기 03 Oct 2020
-
[JAVA]키로거 02 Oct 2020
-
[JAVA]요세푸스 문제 02 Oct 2020
-
[JAVA]방 번호 02 Oct 2020
-
[JAVA]방 배정 01 Oct 2020
-
[JAVA]Strfry 28 Sep 2020
-
[JAVA]에디터 28 Sep 2020
-
[JAVA]개수 세기 28 Sep 2020
-
[JAVA]알파벳 개수 28 Sep 2020
-
[JAVA]별 찍기 - 9 27 Sep 2020
-
[JAVA]별 찍기 - 8 27 Sep 2020
-
[JAVA]별 찍기 - 7 27 Sep 2020
-
[JAVA]별 찍기 - 6 27 Sep 2020
-
[JAVA]별 찍기 - 5 27 Sep 2020
-
[JAVA]별 찍기 - 4 27 Sep 2020
-
[JAVA]별 찍기 - 3 26 Sep 2020
-
[JAVA]별 찍기 - 2 26 Sep 2020
-
[JAVA]별 찍기 - 1 26 Sep 2020
-
[JAVA]카드 역배치 26 Sep 2020
-
[JAVA]핸드폰 요금 26 Sep 2020
-
[JAVA]숫자의 개수 25 Sep 2020
-
[JAVA]숫자 25 Sep 2020
-
[JAVA]일곱 난쟁이 25 Sep 2020
-
[JAVA]대표값2 25 Sep 2020
-
[JAVA]홀수 25 Sep 2020
-
[JAVA]최댓값 24 Sep 2020
-
[JAVA]윷놀이 24 Sep 2020
-
[JAVA]주사위 세개 24 Sep 2020
-
[JAVA]윤년 24 Sep 2020
-
[JAVA]세수정렬 24 Sep 2020
-
[JAVA]시험 성적 23 Sep 2020
-
[JAVA]사칙연산 23 Sep 2020
-
[JAVA]고양이 23 Sep 2020
-
[JAVA]Hello World 23 Sep 2020
-
[JAVA]A+B 23 Sep 2020
-
[JAVA]콜라츠 추측 22 Aug 2020
-
[JAVA]평균 구하기 22 Aug 2020
-
[JAVA]하샤드 수 21 Aug 2020
-
[JAVA]핸드폰 번호 가리기 21 Aug 2020
-
[JAVA]행렬의 덧셈 20 Aug 2020
-
[JAVA]x만큼 간격이 있는 n개의 숫자 20 Aug 2020
-
[JAVA]직사각형 별찍기 11 Aug 2020