~102일차~
가능한 모든 조합의 수를 구하는 것
매 재귀함수마다 실제로 N x N 모든 위치를 볼 필요가 없다.
[ 핵심 ] 맨 처음 행(row)부터 차례대로 퀸을 놓는다고 생각하면 가짓수를 훨씬 줄일 수 있다.
N-Queen 문제는 가능한 조합을 계산하는 것, 현재 행의 이전 행으로 돌아갈 필요가 없다.
백트래킹은 기본적으로 가능한 노드에 대하여 계속해서 재귀적으로 함수 호출
백트래킹은 모든 경우의 수를 탐색하기에 적합하다.
N-Queen 문제를 해결하기 위해서는 특정 위치(노드)의 가능 여부를 판단할 필요가 있다.
가능한 노드 여부는 다음의 두가지를 확인
let n = 8; // 전체 map의 크기
let queens = []; // 현재 체스판에 놓인 퀸(queen)의 위치 정보들
function possible(x, y) {
// (x, y) 위치에 퀸을 놓을 수 있는지 확인
for (let [a, b] of queens) {
// 현재까지 놓았던 모든 queen의 위치를 하나씩 확인하며
if (a == x || b == y) return false; // 행이나 열이 같다면 X
if (Math.abs(a - x) == Math.abs(b - y)) return false; // 대각선 위치한 경우 X
}
return true;
}
let cnt = 0;
function dfs(row) {
if (row == n) cnt += 1; // queen을 N개 배치할 수 있는 경우 카운트
for (let i = 0; i < n; i++) {
// 현재 행(row)에 존재하는 열을 하나씩 확인하며
if (!possible(row, i)) continue; // 현재 위치에 놓을 수 없다면 무시
queens.push([row, i]); // 현재 위치에 퀸 놓기
dfs(row + 1); // 재귀함수 호출
queens.pop(); // 현재 위치에서 퀸 제거
}
}
dfs(0);
console.log(cnt);