본문 바로가기

ProgramSoliving

백준 : 17090 미로 탈출하기

반응형

visit의 방문을 체크하면서  list에 담고 범위를 벗어낫을 경우 ans++ 더하면된다.

 

이때 다음 방문하는 곳에 탈출한적이잇다면 바로 탈출 할수있게 ret 배열을 초기화해준다.

 

package 삼성;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

import 삼성.미로탈출하기.Pair;

public class 미로탈출하기 {
	static int U[] = { -1, 0 };
	static int R[] = { 0, 1 };
	static int L[] = { 0, -1 };
	static int D[] = { 1, 0 };
	static int N, M;

	static class Pair {
		int y;
		int x;

		public Pair(int y, int x) {
			super();
			this.y = y;
			this.x = x;
		}
	}

	static char map[][];
	static boolean visit[][];
	static boolean ret[][];
	static int ans;

	public static void main(String[] args) throws IOException {
		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 char[N][M];
		visit = new boolean[N][M];
		ret = new boolean[N][M];

		for (int i = 0; i < N; i++)
			map[i] = br.readLine().toCharArray();

		ans = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (!visit[i][j]) {
					BFS(i, j);
				}
			}
		}

		System.out.println(ans);

	}

	static Queue<Pair> q;
	static ArrayList<Pair> list;

	private static void BFS(int y, int x) {

		list = new ArrayList<>();
		q = new LinkedList<>();
		q.add(new Pair(y, x));
		visit[y][x] = true;

		while (!q.isEmpty()) {
			Pair cur = q.poll();
			list.add(cur);

			// check 한곳이 아니면 visit을 해본다.
			int ny = 0;
			int nx = 0;

			if (map[cur.y][cur.x] == 'U') {
				ny = cur.y + U[0];
				nx = cur.x + U[1];
			} else if (map[cur.y][cur.x] == 'R') {
				ny = cur.y + R[0];
				nx = cur.x + R[1];
			} else if (map[cur.y][cur.x] == 'L') {
				ny = cur.y + L[0];
				nx = cur.x + L[1];
			} else if (map[cur.y][cur.x] == 'D') {
				ny = cur.y + D[0];
				nx = cur.x + D[1];
			}
//			System.out.println(ny+" "+nx);
			if (ny < 0 || nx < 0 || ny >= N || nx >= M) {
				// 실패 방문한 부분 check true 하고 ret false
				for (Pair p : list) {
					ret[p.y][p.x] = true;
					ans++;
				}
				return;
			}
			if (ret[ny][nx]) {
				for (Pair p : list) {
					ret[p.y][p.x] = true;
					ans++;
				}
				return;
			}

			if (visit[ny][nx])
				continue;
			visit[ny][nx] = true;
			q.add(new Pair(ny, nx));
		}
	}
}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 관중석(10166) JAVA  (0) 2020.05.24
백준 : 10800  (0) 2020.05.22
SW아카데미 : 숫자게임  (0) 2020.05.21
백준 : 13459  (0) 2020.05.18
백준 : 3678 카탄의 개척자  (0) 2020.05.17