가지치기 (Prunning) : 목표의 값이 될 수 있는 가능성이 없어, 해당 노드를 제외
백트래킹 (Backtracking) : 유망하지 않는 쪽으로 가지 않고 다시 돌아오는 것
void dfs(int cnt, int idx) { // 현재까지의 결과, 탐색을 진행할 인덱스
// r개를 선택한 경우
if(cnt == r) {
// 결과 처리 후 현재 가지에 대한 탐색 종료
return;
}
// r개를 선택하지 않은 경우 재귀 호출 반복
for(int i = idx; i < n; i++){
if(!selected[i]){
selected[i] = true; // 상태 변화
dfs(cnt + 1, i); // 재귀 호출
selected[i] = false; // 다음 경우의 수를 위해 상태 복구
}
}
}
row - i == Math.abs(board[row] - board[i] : 퀸이 같은 대각선 위치에 있다는 것이다 (제일 이해가 안 갔던 부분)
abs(x1 - x2) == abs(y1 - y2) 라고 생각하면 된다
같은 대각선에 있다는 것은, 각각의 좌표의 행의 길이와 열의 길이가 같다는 것이다
public class nQueen {
static int n = 4;
static int[] board = new int[n];
static int count;
public static int queen(int row) {
if (row == n) {
count ++;
for (int i = 0; i < n; i++) {
System.out.print(board[i] + " ");
}
System.out.println();
return count;
}
for (int i = 0; i < n; i ++) {
board[row] = i;
if (isPromising(row)) {
queen(row + 1);
}
}
return count;
}
public static boolean isPromising(int row) {
for (int i = 0; i < row; i++) {
if (board[row] == board[i] || row - i == Math.abs(board[row] - board[i])) {
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println(queen(0));
}
}