题目:在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)
}

最新文章

  1. QQ空间/朋友圈类界面的搭建
  2. 命令行提交本地项目到github上
  3. ORM查询语言(OQL)简介--高级篇:脱胎换骨
  4. BZOJ4158 : [POI2007]Railway
  5. rgb转灰度 RGB To Gray php Adobe RGB (1998) [gamma=2.20]
  6. bnuoj 29375 Two Strings(字符串?)
  7. file控件change事件触发问题
  8. 设计模式(十四):Command命令模式 -- 行为型模式
  9. php composer使用
  10. 三个API:开启、关闭、关闭线程重定向
  11. 19届华为实习生笔试之判断iPv6地址类型
  12. Vue一、起步
  13. es6 promise对象
  14. Python之多线程和多进程
  15. 【iCore4 双核心板_FPGA】例程十四:基于I2C的ARM与FPGA通信实验
  16. Oracal
  17. 纸牌屋第一季/全集House of Cards迅雷下载
  18. Java并发编程 -- 文章汇总
  19. 【Foreign】Rectangle [KD-tree]
  20. codevs 1365 浴火银河星际跳跃

热门文章

  1. Python【变量和赋值】
  2. Python进阶:并发编程之Futures
  3. T-SQL学习笔记
  4. go get 使用proxy来下载
  5. Ubuntu Server Swap 分区设置
  6. C#使用消息队列(MSMQ)
  7. DevExtreme学习笔记(一) DataGrid中js分析
  8. pinfinder
  9. MongoDB的删除操作
  10. JMeter测试clickhouse