棋盘n皇后问题-递归
题目:在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皇后问题-递归的更多相关文章
- YTU 3013: 皇后问题(递归)
3013: 皇后问题(递归) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...
- #C++初学记录(N皇后#回溯递归)
<font size=5 face"微软雅黑">N皇后Problem Description <font size=4 face"微软雅黑"& ...
- 八皇后问题 递归实现 C语言 超详细 思路 基础
八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...
- 2n皇后问题-------递归 暴力求解题与分布讨论题
问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一 ...
- java实现八皇后问题(递归和循环两种方式)
循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVA ...
- 八皇后问题 --- 递归解法 --- java代码
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后 ...
- N皇后问题——递归求解
比较简单,废话不说,上代码: public class NQueen { //比如:position[1]=3,表示第一行的第三列有一个皇后 private int [] position; //总的 ...
- [LeetCode系列]N皇后问题递归解法 -- 位操作方式
N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. ...
- 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)
</pre><pre name="code" class="cpp">/* Theme:八皇后(非递归) Coder:秒针的声音 Tim ...
随机推荐
- 使用mybatis完成增删改查
插入 插入数据 <insert id="insertUser2" parameterType="UserEntity"> insert into u ...
- Visual Studio 设置为 UTF-8 保存格式
1. 步骤 Visual Studio 提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符. 在 VS 中,该命令没有默认显示在「文件」菜单中.用户需要手工设置,才能显示该命令. ...
- hadoop 节点退役和服役
节点的服役和退役(hdfs)---------------------- 黑白名单的组合情况-------------------------include //dfs.includeexclude ...
- Hystrix 用法及注解用法
一.hystrix参数使用方法 通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时间命令执行超时时间,为1000ms和执行是不启用超时 ...
- java-websocket客户端 断线重连 注入Service问题
java版客户端: 使用开源项目java-websocket, github地址: https://github.com/TooTallNate/Java-WebSocket github上有很多示例 ...
- WebUploader 上传图片回显
/* fileMaxCount 最大文件数 buttonText 按钮文本 multiple 是否多选 */ (function ($) { $.fn.extend({ uploadImg: func ...
- Python实现行列式计算
数学公式: 代码: # 逆序数 def getInversion(numlist): count = 0 for i in range(1,len(numlist)): subscript = num ...
- Django 报错总结
报错: AttributeError: 'NoneType' object has no attribute 'split' 最近在写网站中遇到一个问题,就是题目上所写的:AttributeError ...
- MySQL性能测试调优
MySQL性能测试调优 操作系统 基本操作 查看磁盘分区mount选项 $ mount 永久修改分区mount选项(系统重启后生效) 修改文件 /etc/fstab 中对应分区的mount optio ...
- java 里执行javascript代码
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; ScriptEngineManager sem = ...