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

그래프 탐색... 재밌다............
이 문제는 좀 쉬웠던 것 같다.
내가 아무것도 안보고 40분 안에 풀어냈으니 !!
dfs를 사용해서 매개변수로 파이프의 방향을 넣어 1(가로), 2(세로), 3(대각선)으로 표현한다.
그래서 각 경우에 따라 이동할 수 있는 방법들을 dfs로 재귀호출 하면 된다!
여기서 주의할 것은 모든 경우의 수를 다 구해야 하니까 visit로 경로를 추적할 필요가 없다.
근데 그래프 탐색할 때 x랑 y 넘 헷갈림 ㅠㅠ
x좌표(가로), y좌표(세로)로 하고 배열에 넣을 때는 [y][x]로 하는 느낌으로 하고 있는데...
헷갈린다 ㅠㅠ
package _240705;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_파이프옮기기1 {
static int N, cnt=0;
static int arr[][];
public static void main(String[] args) throws Exception{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(bufferedReader.readLine());
arr = new int[N+1][N+1];
for(int i=1;i<=N;i++){
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int j=1;j<=N;j++){
arr[i][j] = Integer.parseInt(stringTokenizer.nextToken());
}
}
dfs(2,1,1);
System.out.println(cnt);
}
static void dfs(int x, int y, int d){ // d 방향 가로1, 세로2, 대각3
if(x == N && y == N){
cnt++;
return;
}
if(d==1){
// 가로
if(check(x+1, y)){
dfs(x+1, y, 1); // 가로에서 가로로
}
if(check(x+1, y) && check(x+1, y+1) && check(x, y+1)){
dfs(x+1, y+1, 3); // 대각선 오른쪽 아래로
}
} else if(d==2){
// 세로
if(check(x, y+1)){
dfs(x, y+1, 2); // 세로에서 세로
}
if(check(x+1, y) && check(x+1, y+1) && check(x, y+1)){
dfs(x+1, y+1, 3); // 대각선 오른쪽 아래로
}
} else if(d==3){
// 대각선
if(check(x+1, y)){
dfs(x+1, y, 1); // 대각선에서 가로로
}
if(check(x, y+1)){
dfs(x, y+1, 2); // 세로에서 세로
}
if(check(x+1, y) && check(x+1, y+1) && check(x, y+1)){
dfs(x+1, y+1, 3); // 대각선 오른쪽 아래로
}
}
}
static boolean check(int x, int y){
if(x <= 0 || y <= 0 || x > N || y > N || arr[y][x]==1){
return false;
}
return true;
}
}