퍼즐
n 여왕의 문제. NXN의 체스 보드에 N Queens를 배치하십시오. 여기서 두 퀸이 같은 행에, 같은 열 또는 같은 대각선에 있지 않아 서로 공격 할 수 없습니다.
전략
역 추적 방법.
자바 스크립트 솔루션
8 여왕의 질문을 예로 들어보십시오.
코드 사본은 다음과 같습니다.
/**
* 12/28/14에 Chao에 의해 만들어졌습니다.
*/
함수 getnqueens (Order) {
if (주문 <4) {
Console.log ( '퀸즈 문제 3'보다 큰 주문에 적용);
반품;
}
var nqueens = [];
var 역 추적 = 거짓;
Rowloop :
for (var row = 0; row <order; row ++) {
if (nqueens [row] === 정의되지 않은) {
nqueens [row] = [];
}
for (var col = 0; col <order; col ++) {
if (nqueens [row] [col] === 0) {
계속하다;
} else if (backtracking && nqueens [row] [col] == 1) {
if (col === order-1) {
리 세트 (Nqueens, Order, Row);
행 = 행 -2;
Rowloop를 계속하십시오.
}
nqueens [row] [col] = 0;
역 추적 = 거짓;
계속하다;
}
nqueens [row] [col] = 1;
if (isqueenvalid (nqueens, row, col)) {
Rowloop를 계속하십시오.
} else if (col == order-1) {
역 추적 = true;
리 세트 (Nqueens, Order, Row);
행 = 행 -2;
Rowloop를 계속하십시오.
} 또 다른 {
nqueens [row] [col] = 0;
계속하다;
};
}
}
반환 Nqueens;
}
함수 리 세트 (Nqueens, Order, Row) {
for (var col = 0; col <order; col ++) {
nqueens [row] [col] = 정의되지 않은;
}
}
기능 isqueenvalid (nqueens, row, col) {
for (var i = 0; i <col; i ++) {
if (nqueens [row] [i] == 1) {
거짓을 반환합니다.
}
}
for (var j = 1; j <row+1; j ++) {
if (nqueens [row-j] [col] == 1 || (nqueens [row-j] [col-j]! = undefined && nqueens [row-j] [col-j] == 1) || (nqueens [row-j] [col+j]!
거짓을 반환합니다.
}
}
진실을 반환하십시오.
}
기능 printqueens (Queens) {
for (var row = 0; row <queens.length; row ++) {
var rowText = '';
for (var col = 0; col <Queens.length; col ++) {
if (Queens [row] [col] === 정의되지 않은) {
여왕 [행] [col] = 0;
}
rowText = rowText + Queens [row] [col] + '';
}
Console.log (RowText);
}
}
var queens = getnqueens (8);
프린트 큐 (퀸즈);
결과
코드 사본은 다음과 같습니다.
1 0 0 0 0 0 0
0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0
0 0 0 1 0 0 0