递归+回溯

  • 创建arr数组存储皇后的摆放情况,初始化为全0
  • check函数表示当前放置位置是否合法

递归:对于每一行,逐列检查是否合法,合法则在arr数组对应的位置置为1,然后递归

function Nqueen( n ) {
  let count = 0;
  
  let arr = [];
  for(let i=0; i<n; i++){
    arr.push([]);
    for(let j=0; j<n; j++)
      arr[i][j] = 0;
  }
  
  function check(row,colomn){//arr[row][colomn]置为1是否合法
    for(let i=0; i<row; i++){
      let index = arr[i].indexOf(1);//index就是第i行的下标
      if (index == colomn)
        return false;
      if( Math.abs(i-row) == Math.abs(index-colomn) )
        return false;
    }
    return true;
  }
  
  function traceTrack(len){//len表示给第len行放置棋子
    if(len>=n){
      count++;
      return;
    }
      
    for(let i=0; i<n; i++){//i表示第i列
      if(check(len,i) == true){
        arr[len][i] = 1;
        traceTrack(len+1);
        arr[len][i] = 0;
      }
    }
  }
  
  
  traceTrack(0);
  return count;
}