n皇后问题作为经典的面试题,今天在LeetCode刷到,解法比较直接,回溯递归。其他解法咱也不会。。。。
Leetcode地址:https://leetcode.com/problems/n-queens/description/
n皇后问题:在n*n的棋盘格中放置那个棋子,使得这n个棋子不在同一行,不在同一列,不在同一对角线,不在同一斜对角线上,找出所有可行的结果集。
解题思路:1.先把回溯算法写出来
2.用一个数组储存临时结果,写个函数判断该棋子所在位置是否符合要求。
代码如下:
/** * @param {number} n * @return {string[][]} */ //回溯 var solveNQueens = function(n) { var res=[]; var curr=[]; //临时储存其中一个结果 for(var i=0;i<n;i++){ curr[i]=new Array(); for(var j=0;j<n;j++){ curr[i][j]='.' } } backtrack(curr,res,0) return res; }; var backtrack = function(curr,res,row){ if(curr.length===row){ var c=[]; for(var i=0;i<curr.length;i++){ c.push(curr[i].join('')); } res.push(c); return ; } //遍历每一行所有元素 for(var col=0;col<curr.length;col++){ //判断该位置是否有效 if(isValid(row,col,curr)){ curr[row][col]="Q" backtrack(curr,res,row+1); curr[row][col]="." } } }; var isValid=function(row,col,curr){ for(var i=0;i<row;i++) //列 if(curr[i][col]==='Q') return false; for(var i=row-1,j=col-1;i>=0 && j>=0;i--,j--) //对角线 if(curr[i][j]==="Q") return false; //斜对角线 for(var i=row-1,j=col+1;i>=0 && j<curr.length ; i--,j++){ if(curr[i][j]==="Q") return false; } return true; };