当前位置: 首页 > news >正文

8皇后问题--回溯法 (循环递归)

N皇后问题


问题描述:
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)


1.由于每个棋子不可能同行,因此可以理解为从棋盘每行拿个棋子出来
2.由于每列棋子也不相同,因此没有同一个数字可以在一个列
3.综合1,2,问题转化为给[0-7]做全排列,然后满足没有两个数字在同一个斜线
4.根据斜率公式 (x1-x2)/(y1-y2),因此根据这个条件排出同线的组合
5.余下的组合即为每行棋子的列位置,索引,就是行号


var MAX = 8;

var Ann = function a(arr){


if(arr.length == 1){return arr;}


var rr = new Array();
for(var i = 0; i<arr.length;i++){


//get a copy
var ar = new Array();
for(var j = 0; j < arr.length;j++){ar[j] = arr[j];}


//assume i
var current = ar[i];
ar.splice(i,1);


var childRet = a(ar);


for(var k = 0 ;k < childRet.length;k++){
var str = (current + "," + childRet[k]);

if(str.length != 2 * MAX-1 || !sameLine(str)){
rr.push(str);
}

}


}


return rr;
}

var initArr = new Array();
for(var i = 0;i < MAX; i++){initArr.push(i);}

var ret = Ann(initArr);

for(var i = 0;i < ret.length;i++){
outRet(ret[i]);
}


var count = 0;

function outRet(r) {
count = count + 1;
console.log("==============" + "," + count.toString());
var a = r.split(',');
for(var i = 0;i < MAX; i++){

var aa = new Array();
for(var j = 0;j < MAX; j++){
aa.push(0);
}
aa[a[i]] = 1;
console.log(aa);

}
}


function sameLine(str){
var arr = str.split(',');
for(var i = 0;i < arr.length; i++){
for(var j = 0;j < arr.length; j++){
if(i!=j&&Math.abs(i-j) == Math.abs(arr[i]-arr[j])){return true;}
}

}
return false;

}


相关文章:

  • Windows 7:在Homegroup中链接在线ID并共享文件
  • 解方程 (允许误差)
  • 算法基础练习--最大公约数和最小公倍数
  • Windows 7解码包Win7codecs 1.0.4正式版
  • 哥德巴赫猜想: 任何一个大于2的偶数都可以拆分为两个素数的和
  • Windows7右键菜单中集成复制和移动
  • 分解质因数算法
  • 实测:Windows 7 Build 7057性能再进一步
  • 教你如何硬盘安装Win7全攻略
  • 算法练习--连续整数固定和
  • Windows 7中从VHD文件启动计算机
  • Javascript --扩展String实现替换字符串中index处字符
  • 算法练习之牛顿法求平方根
  • 去掉数组中的重复元素
  • 浅谈单例的三种实现--C#
  • 03Go 类型总结
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JavaScript创建对象的四种方式
  • linux安装openssl、swoole等扩展的具体步骤
  • ucore操作系统实验笔记 - 重新理解中断
  • vue-loader 源码解析系列之 selector
  • Yii源码解读-服务定位器(Service Locator)
  • 分享一份非常强势的Android面试题
  • 构建二叉树进行数值数组的去重及优化
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 排序(1):冒泡排序
  • 算法之不定期更新(一)(2018-04-12)
  • 与 ConTeXt MkIV 官方文档的接驳
  • 自定义函数
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #etcd#安装时出错
  • #QT(TCP网络编程-服务端)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (七)理解angular中的module和injector,即依赖注入
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .Net7 环境安装配置
  • .NET中winform传递参数至Url并获得返回值或文件
  • @RequestMapping用法详解
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [android] 请求码和结果码的作用