- backtracking(int depth, int start, int n, int m)
1. 탐색 범위를 위해 depth,n,m을 파라미터로 받는다
2. 또한 탐색의 시작 위치를 위해 start를 파라미터로 받는다
- backtracking(depth+1, i+1, n, m)
1. 재귀식으로 깊이를 증가시켜주며, 현재 탐색지점의 다음 지점으로 start 인수를 넘겨준다
- if(depth == n x m){return;}
1. 탐색의 종료지점인 n x m에 depth가 도달한다면 백트래킹을 종료한다
import java.io.*;
import java.util.*;
public class Main {
static boolean[][] visited;
static int ans = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
visited = new boolean[n][m];
backtracking(0, 0,n,m);
bw.write(ans+"");
br.close();
bw.close();
}
private static void backtracking(int depth, int start, int n, int m) {
if(chk(n, m)){
ans++;
}
if(depth == n * m){
return;
}
for (int i = start; i < n*m; i++) {
int r = i / m;
int c = i % m;
if(!visited[r][c]){
visited[r][c] = true;
backtracking(depth+1,i+1,n,m);
visited[r][c] = false;
}
}
}
private static boolean chk(int n, int m) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < m - 1; j++) {
if(visited[i][j] && visited[i][j+1] && visited[i+1][j] && visited[i+1][j+1]){
return false;
}
}
}
return true;
}
}