어제부터 오늘까지 N-Queen의 늪에 빠져서 허우적 대고있다. 차근차근 해결 되나 싶더니 Queen에서 문제가 발생하였다. Rook은 어찌저찌 구현을 해서 성공을 해서 Queen도 Rook에서 크게 벗어나지 않겠지 하고 풀었는데 뭔가 안된다... 머리가 터질것 같다.
먼저 Rook의 해답 하나를 찾아주는 함수를 보겠다.
findRooksSolution = function (n) {
const solution = new Board({n: n});
let makeAsolution = function (rowIdx, colIdx, countPiece) {
if (countPiece === 0) {
return;
}
solution.togglePiece(rowIdx,colIdx);
makeAsolution(rowIdx + 1, colIdx + 1, countPiece - 1);
}
makeAsolution(0, 0, n);
// console.log('Single solution for ' + n + ' rooks:', JSON.stringify(solution.rows()));
return solution.rows();
};
룩은 특성상 대각선으로만 놓으면 그게 해답이기 때문에 복잡하게 가지 않고 그냥 이렇게 작성을 하였다.
그리고 해답의 개수를 찾는 함수
countRooksSolutions = function (n) {
let solutionCount = 0;
let pieces = n;
let board = new Board({n: n});
let countingUp = function(rowIdx, restPieces) {
if (restPieces === 0) {
solutionCount += 1;
} else {
for (let i = 0; i < n; i += 1) {
board.togglePiece(rowIdx, i);
if (!board.hasAnyRooksConflictsOn(rowIdx, i) && rowIdx < pieces) {
countingUp(rowIdx + 1, restPieces - 1);
}
board.togglePiece(rowIdx, i);
}
}
}
countingUp(0, n);
return solutionCount;
};
카운팅 업 함수를 만들어 주었고. 만약 충돌이 일어나면 재토글로 빼주고 아니면 다음 행으로 들어가는 형태로 구현 하였다. 그리고 모든 기물을 다 놓으면 솔루션 카운트 하나를 업 해주는 것으로 솔루션의 개수를 계산할 수 있었다. 어디가 문제 인지 잘 모르겠지만 (ㅠㅠㅠ) 10초 이상을 소모하였다.
여기까진 힘겹게 했지만 통과를 했는데 Queen이 문제다... Queen이 이 방식대로해도 안먹히는 것... 도대체 뭐가 문제일까... 멀미가 난다... 아마 풀이법을 바꿔야하지 않을까 싶다. 시간이 부족하여 일단 Rook이 구현 된 것으로 만족하고 실마리를 찾아 나서다가 주말에 제대로 고민해봐야겠다.