最近一直跟着一位朋友补习各种算法,看到八皇后问题,参考了网上的一些资料,自己用JavaScript做了一个基于DFS的实现,不足之处还请大家批评指正。
代码如下
"ues strict";
let chessBoard = [];
let result = [];
const row = [0, 0, 0, 0, 0, 0, 0, 0];
for(let i = 0; i < 8; i++) chessBoard.push(Array.from(row)); //初始化棋盘
function check(x, y) { //检查某坐标位置会不会受到已有棋子的攻击
for(let X = 0; X < 8; X++) {
for(let Y = 0; Y < y; Y++) { //必须是Y < y而不是Y < 8.因为事实上如果有棋子被放在棋盘最右侧,它在回溯的时候并不会被马上拿走,必须要忽略掉
if(chessBoard[Y][X] && (x === X || Y - X + x === y || Y + X - x === y)) { //利用直线方程判断
return false;
}
}
}
return true;
}
function search(y) {
if(y > 7) { //由于每一行至多只能摆一个棋,因此当第八行摆完后,必定找到一种正解,本次搜索直接结束
result.push(Array.from(chessBoard));
return;
}
for(let x = 0; x < 8; x++) { //逐个尝试在当前行的所有位置摆棋子
chessBoard[y] = Array.from(row); //每次尝试摆放棋子前都要重新清洗本行,拿走回溯前摆放的棋子
if(check(x, y)) { //如果当前位置可以放,就将它摆在棋盘上,并尝试走下一行
chessBoard[y][x] = 1;
search(y+1);
}
}
}
search(0);
console.log(result);
输出效果(共92种解):
