//左上
//i,j 行列索引,array放置皇后 所在列
function checkLeftTop(i, j, a) {
for (let m = i - 1, n = j - 1; m >= 0 && n >= 0; m--, n--) {
//a[m] 上行皇后所在列
if (a[m] === n) {
return false;
}
}
return true;
}
//上
function checkTop(i, j, a) {
for (let m = i - 1; m >= 0; m--) {
if (a[m] === j) {
return false;
}
}
return true;
}
//右上
function checkRightTop(i, j, colNum = 8, a) {
for (let m = i - 1, n = j + 1; m >= 0 && n < colNum; m--, n++) {
if (a[m] === n) {
return false;
}
}
return true;
}
function queen(n = 8) {
//arr皇后所在列
let arr = [0, 0, 0, 0, 0, 0, 0, 0];
solve(1, arr, 8);
console.log(arr);
}
//放置皇后位置
function solve(row = 1, arr, n = 8) {
let isOk = false;
let i = row - 1;
for (let j = 0; j < n; j++) {
arr[i] = j;
//检测皇后是否冲突
let a = checkTop(i, j, arr);
let b = checkLeftTop(i, j, arr);
let c = checkRightTop(i, j, n, arr);
let flag = a && b && c;
if (flag) {
if (row === n) {
return true;
}
isOk = solve(row + 1, arr, n);
}
if (isOk) {
return isOk;
}
}
return isOk;
}
queen(8)
练习递归