码迷,mamicode.com
首页 > 其他好文 > 详细

棋盘n皇后问题-递归

时间:2019-11-19 17:19:23      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:问题   维数   位置   重复   dex   tin   ==   代码   code   

题目:在n*n的棋盘上,放n个皇后,互不攻击(不可在同行/列/对角线)

分析:将棋盘抽象成一个一维数组[0,1,2......,n*n-1],x=~~(i/n)取整,y=i%n;
         decisions是放n个皇后的一维坐标

代码:queen(n)可获得最后结果。

function queen(n, decisions=[], decisionSet=new Set()) {
  if (decisions.length === n) {
    /***过滤重复内容*********/
    decisions.sort((a,b) => a-b);
    const hash = decisions.join(‘-‘);
    if (decisionSet.has(hash)) return [];
    decisionSet.add(hash);
    /**********************/
    return [decisions];
  }
  let r = [];
  for(let i = 0;i < n*n; i++) {
    if(decisions.indexOf(i) === -1) {
      // 保证遍历的内容不存在攻击
      if (decisions.every(item => compatible(item, i, n))) {
        r = r.concat(queen(n, decisions.concat(i), decisionSet))              
      } 
    }
  }
  return r;
}
//判断decisions是否符合要求,数组内两两比较
function is_goal(n, decisions) {
  for(let i = 0; i < n; i++) {
    for(let j = i+1; j < n; j++) {
      if(i===j) continue;
      const p = decisions[i];
      const q = decisions[j];
      if(!compatible(p,q,n)) {
        return false
      }
    }
  }
  return true;
}
function compatible(p,q,n) {// 判断位置p,q是否存在互相攻击
  const [x1, y1] = [~~(p/n), p % n];
  const [x2, y2] = [~~(q/n), q % n];
  return x1!==x2 && y1!==y2 && Math.abs(x1-x2) !== Math.abs(y1-y2)
}

 

棋盘n皇后问题-递归

标签:问题   维数   位置   重复   dex   tin   ==   代码   code   

原文地址:https://www.cnblogs.com/lyraLee/p/11890404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!