【新人报道】利用JavaScript解答八皇后问题

245 阅读1分钟

最近一直跟着一位朋友补习各种算法,看到八皇后问题,参考了网上的一些资料,自己用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种解):

参考资料

juejin.cn/post/684490…
juejin.cn/post/684490…