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