[LIVE] 식당예제 <Java>

sso_ojiin·2021년 2월 18일
0

LIVE

목록 보기
1/3
post-thumbnail
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B2_RestaurantTest {
	static int R,C,cnt=0;
	static char[][] map;
	static boolean[][] visited;
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		map = new char[R][];
		visited = new boolean[R][C];
		
		for(int i=0;i<R;i++) {
			map[i] = in.readLine().toCharArray();
		}
		makePipe();
		System.out.println(cnt);
	}
	
	private static void makePipe() {
		cnt=0;
		//윗줄부터 시도
		for(int i=0;i<R;i++) {
			visited[i][0] = true;
			dfs(i,0);
			
		}
	
	
	}
	static int[] dr = {-1,0,1};
	private static boolean dfs(int r, int c) {//현재 탐색위치 받아야함
		if(c==C-1) {
			cnt++;
			return true;//파이프놓기 성공
		}
		
		int nr, nc = c+1;
		for(int d=0;d<3;d++) {
			nr = r+dr[d];
			if(nr<0 || nr>=R || map[nr][nc]=='x' ||visited[nr][nc]) continue;//열은 기저조건에서 제한(경계체크x)
				visited[nr][nc]=true;
				if(dfs(nr,nc)) return true;//끝까지 갔다 왔으면 계속 리턴
				//visited[nr][nc]=false; //실패했던 흔적 되돌리지 않기 : 뒤의 선택지의 방향은 현재보다 유리하지 않은 상황이고 결국 같은 상황이다.
		}
		
		return false;//파이프놓기 실패
	}
	
	
}
profile
SSAFY 5기

0개의 댓글