티스토리 뷰

Algorithm

백준_빵집_3109

Young_J 2020. 10. 11. 02:04

//알고리즘

1. dfs문제

2. 백트래킹으로 풀어야 함.

3. 시작위치부터 방문배열을 체크하면서 끝까지 도달하게 만들고

   flag 변수를 사용하여 끝에 닿았다면 더이상 dfs를 못하게 탈출 시킴.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 빵집_3109 {
	static int R, C, Ans;
	static char[][] map;
	static int[] dr = { -1, 0, 1 };
	static int[] dc = { 1, 1, 1 };
	static boolean[][] v;
	static boolean flag;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());

		map = new char[R][];
		v = new boolean[R][C];

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

		for (int r = 0; r < R; r++) {
			flag = true;
			dfs(r, 0);
		}
		System.out.println(Ans);
//		print(v);
	}

	private static void print(boolean[][] v) {
		for (int i = 0; i < v.length; i++) {
			for (int j = 0; j < v[i].length; j++) {
				System.out.print(v[i][j] + " ");
			}
			System.out.println();
		}
	}

	private static void dfs(int r, int c) {
		if (c == C - 1) {
			flag = false;
			Ans++;
			return;
		}

		for (int k = 0; k < 3; k++) {
			int nr = r + dr[k];
			int nc = c + dc[k];

			if (nr < 0 || nc < 0 || nr >= R || nc >= C)
				continue;
			if (v[nr][nc] || map[nr][nc] == 'x' || !flag)
				continue;
			v[nr][nc] = true;
			dfs(nr, nc);
		}

	}

}

'Algorithm' 카테고리의 다른 글

SW Expert Academy_디저트 카페  (0) 2020.10.13
백준_사탕게임_3085  (0) 2020.10.12
백준_빙고_2578  (0) 2020.10.09
백준_블랙잭_2798  (0) 2020.10.08
백준_1로 만들기_1463  (0) 2020.10.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/10   »
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
글 보관함