티스토리 뷰

728x90

문제

https://www.acmicpc.net/problem/17070

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의

www.acmicpc.net

 

 

풀이 및 소스코드

 

moving_pipe를 통해 파이프를 놓을 좌표의 경우의 수를 구한다.

moving_pipe를 돌리면서 d 라는 변수에 방향을 같이 주어서 스위치문을 통해 다음 놓을 파이프 자리를 정할 수 있다.

만약 이동했을 때 [n,n] 에 도달한다면 res 값을 증가시켜주고 return 한다.

 

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

class Main {
	static int res, n;
	static int[][] h;
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		n = Integer.parseInt(br.readLine());
		h = new int[n][n];
		for(int i=0;i<n;i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0;j<n;j++) {
				h[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		h[0][0] = 1;
		h[0][1] = 1;
		int x = 0;
		int y = 1;
		//현재 위치
		int d = 0;
		//d : 0(가로) 1(세로) 2(대각선)
		moving_pipe(x, y, d);
		System.out.println(res);
	}
	public static void moving_pipe(int x, int y, int d) {
		switch (d) {
		case 0:
			if(y+1<n&&h[x][y+1]==0) {
				if(y+1==n-1&&x==n-1) {
					res++;
					return;
				}
				moving_pipe(x, y+1, 0);
			}
			if(x+1<n&&y+1<n) {
				if(h[x+1][y]==0&&h[x][y+1]==0&&h[x+1][y+1]==0) {
					if(x+1==n-1&&y+1==n-1) {
						res++;
						return;
					}
					moving_pipe(x+1, y+1, 2);
				}
			}
			break;

		case 1:
			if(x+1<n&&h[x+1][y]==0) {
				if(x+1==n-1&&y==n-1) {
					res++;
					return;
				}
				moving_pipe(x+1, y, 1);
			}
			if(x+1<n&&y+1<n) {
				if(h[x+1][y]==0&&h[x][y+1]==0&&h[x+1][y+1]==0) {
					if(x+1==n-1&&y+1==n-1) {
						res++;
						return;
					}
					moving_pipe(x+1, y+1, 2);
				}
			}
			break;
		case 2:
			if(y+1<n&&h[x][y+1]==0) {
				if(y+1==n-1&&x==n-1) {
					res++;
					return;
				}
				moving_pipe(x, y+1, 0);
			}
			if(x+1<n&&h[x+1][y]==0) {
				if(x+1==n-1&&y==n-1) {
					res++;
					return;
				}
				moving_pipe(x+1, y, 1);
			}
			if(x+1<n&&y+1<n) {
				if(h[x+1][y]==0&&h[x][y+1]==0&&h[x+1][y+1]==0) {
					if(x+1==n-1&&y+1==n-1) {
						res++;
						return;
					}
					moving_pipe(x+1, y+1, 2);
				}
			}
			break;
		}
	}
}
반응형