a算法解决八数码问题_javascript,八皇后问题解决

八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,
即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
八皇后问题思路
1.第一个皇后先放第一行第一列
2.第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适
3.继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解
4.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.
5.然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4的步骤

方法check和方法check2的原理其实是一样的,check方法用的是递归实现,check2方法用的是普通for循环实现,

根据排队组合理论

八皇后的放置位置一共有8的8次方个,

每个皇后都有八种放置位置,所以乘起来就是8的8次方个,

check2方法的8个for循环就是这个道理

/*** 八皇后问题八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。八皇后问题思路
1.第一个皇后先放第一行第一列
2.第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适
3.继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解
4.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.
5.然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4的步骤 * * *///定义一个max表示共有多少啊个皇后
const max = 8;
//定义数组array,保存皇后放置位置的结果,arr的index表示行,arr[index]值表示列,比如arr = {0,4,7,5,2,6,1,3},
//比如第二个皇后的坐标为第二行第四列
let array = new Array(max), step = 0, resultArr = [];
let array2 = new Array(max), step2 = 0, resultArr2 = [];//测试八皇后是否正确
check(0);
console.log('步数:', step);
console.log('解法数组:', resultArr);
check2();
console.log('步数2:', step2);
console.log(resultArr2)//编写一个方法,放置第n个皇后
function check(n) {if (n === max) { // n=8,其实八个皇后就已经放好了resultArr.push([...array])return}//依次放入皇后,并判断是否冲突for (let i = 0; i < max; i++) {//先把当前这个皇后n,放在该行的第1列array[n] = i;//统计步数step++;//判断当放置第n个皇后到i列时,是否冲突if (judge(n)) {//不冲突//接着放第n+1个皇后,即开始递归check(n + 1)}//如果冲突,就继续执行array[n] = i;即将第n个皇后,放置在本行的后移的一个位置}
}//第二种写法,使用for循环遍历完成
//八层for循环
function check2() {for (let a = 0; a < 8; a++) {array2[0] = a;step2++;if (!judge2(0)) {continue}for (let b = 0; b < 8; b++) {array2[1] = b;step2++;if (!judge2(1)) {continue}for (let c = 0; c < 8; c++) {array2[2] = c;step2++;if (!judge2(2)) {continue}for (let d = 0; d < 8; d++) {array2[3] = d;step2++;if (!judge2(3)) {continue}for (let e = 0; e < 8; e++) {array2[4] = e;step2++;if (!judge2(4)) {continue}for (let f = 0; f < 8; f++) {array2[5] = f;step2++;if (!judge2(5)) {continue}for (let g = 0; g < 8; g++) {array2[6] = g;step2++;if (!judge2(6)) {continue}for (let h = 0; h < 8; h++) {array2[7] = h;step2++;if (judge2(7)) {resultArr2.push([...array2])}}}}}}}}}
}//当我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突
/*** * @param {表示第n个皇后} n */
function judge(n) {for (let i = 0; i < n; i++) {//1.array[i] == array[n] 表示判断第n个皇后是否和前面的n-1个皇后在同一列//2.Math.abs(n-i) === Math.abs(array[n] - array[i])表示在同一个斜线//n=1 放置第2列1 n=1 array[1] = 1// Math.abs(1-0) == 1 Math.abs(array[n] - array[i])=Math.abs(1-0) = 1//3.判断是否在同一行,没有必要,n每次都在递增if (array[i] === array[n] ||Math.abs(n - i) === Math.abs(array[n] - array[i])) {return false}}return true
}function judge2(n) {for (let i = 0; i < n; i++) {//1.array[i] == array[n] 表示判断第n个皇后是否和前面的n-1个皇后在同一列//2.Math.abs(n-i) === Math.abs(array[n] - array[i])表示在同一个斜线//n=1 放置第2列1 n=1 array[1] = 1// Math.abs(1-0) == 1 Math.abs(array[n] - array[i])=Math.abs(1-0) = 1//3.判断是否在同一行,没有必要,n每次都在递增if (array2[i] === array2[n] ||Math.abs(n - i) === Math.abs(array2[n] - array2[i])) {return false}}return true
}

测试:

de8904f3bef0bd3ffad97d8238ef5a99.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目中使用mock(二)

一&#xff0c;安装&#xff1a; npm install mockjs --save-dev目录&#xff1a; src 同级目录下新建 mock 文件夹 下 新建 mock.js 和 tags.js 文件 二&#xff0c;main.js 中导入&#xff1a; require(/mock/mock.js)三&#xff0c;mock.js 文件&#xff1a; const Moc…

CentOS6.9部署zabbix3.0监控系统

环境&#xff1a; [rootredis ~]# uname -a Linux redis 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux [rootredis ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [rootredis ~]# getenforce Disabled [rootredis …

输出整形变量语句_Python合集之Python变量

在上一节的合集中&#xff0c;我们了解了Python的保留字与标识符&#xff0c;本节我们将进一步了解一下Python中关于变量的问题。变量严格意义上来讲应该称之为“名称”&#xff0c;也可以理解为标签。在Python中&#xff0c;不需要先声明变量名及其数据类型&#xff0c;直接赋…

FormData使用方法详解

FormData的主要用途有两个&#xff1a; 1、将form表单元素的name与value进行组合&#xff0c;实现表单数据的序列化&#xff0c;从而减少表单元素的拼接&#xff0c;提高工作效率。 2、异步上传文件 一、创建formData对象 1、创建一个空对象&#xff1a; //通过FormData构造函…

IKVM:java代码c#调用

在工作中遇到对接java接口&#xff0c;涉及到java加密或签名问题&#xff0c;.net无法实。就将java代码编辑为dll给.net调用 注&#xff1a;这里只做简单java代码处理&#xff0c;不涉及到复杂的java包 java文件处理&#xff1a; 第一步:简单java代码 package com.zht;//c#命名…

activemq 连接_ActiveMQ网络连接器

activemq 连接这篇文章对我以及对ActiveMQ的网络连接器的工作方式可能感兴趣的任何ActiveMQ贡献者都适用。 我最近花了一些时间查看代码&#xff0c;并认为最好画一些快速的图表来帮助我记住我学到的知识&#xff0c;并在将来发现问题时帮助将来确定在哪里进行调试。 如果我输入…

如何让fragment刷新界面_快速实现android版抖音主界面的心得

原文作者&#xff1a;DK_BurNIng如何快速确定竞品某个界面的实现方式&#xff1f;当你收到产品一个需求是模仿某个竞品且时间很短没有过多时间给你调研技术方案的时候&#xff0c;如何尽快确定这个功能的技术方案呢&#xff1f; 这里我给出我自己的一个小窍门&#xff0c;可以避…

js的深浅拷贝( 赋值后原值被覆盖的问题 )

1&#xff0c;浅拷贝&#xff08; 浅拷贝会复制所有引用对象的指针&#xff0c;而不是具体的值 &#xff09; 复制对象的所有属性都不是引用类型时&#xff0c;就可以使用浅拷贝 浅拷贝方式&#xff1a; Object.assign() [].slice()2&#xff0c;深拷贝&#xff08; 复制一个…

使用JBoss Cool Store的终极云零售指南

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 我们从头到尾讨论了各个层&#xff0c;但尚未为您提供除Red Hat Container Development Kit&#xff08;CDK&#xff09;之外的任何应用程序开发…

02.Python 3.6.4下载与安装

02.Python 3.6.4下载与安装 https://www.python.org/downloads/release/python-364/ Windows x86-64可执行文件安装程序视窗对于AMD64 / EM64T / x64&#xff0c;不是安腾处理器bee5746dc6ece6ab49573a9f54b5d0a131684744SIG我下载的是这个&#xff1a; https://www.python.or…

根据浏览器navigator区分PC端还是移动端,区分操作系统,区分浏览器型号

1&#xff0c;区分PC端还是移动端 methods:{_isMobile() {let flag navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)return flag;}, }, m…

mysql 用户授权_mysql添加、删除用户和授权用户

MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):1.新建用户1.1 登录MYSQL&#xff1a;>mysql -u root -p>密码1.2 创建用户&#xff1a;mysql> insert into mysql.user(Host,User,Password) values("localhos…

2018年1月 常用的linux命令

项目中经常用到的Linux命令 &#xff08;注意&#xff1a;linux命令要小写哦&#xff01;&#xff09; &#xff08;1&#xff09;、ls 显示当前目录下的文件 &#xff08;2&#xff09;、vi vim 进入编辑器&#xff0c;可以选择你要编辑的文档&#xff0c;一般我们将项目打…

vue-element-admin中 vuex 的使用

vue-element-admin 中 vuex 是模块化的。 登录流程 1&#xff0c;HTTP 配置&#xff08;utils/request.js&#xff09; 2&#xff0c;API 配置&#xff08;api/user.js&#xff09; import request from /utils/requestexport function login(username, password) {return …

javafx2_JavaFX 2 GameTutorial第4部分

javafx2介绍 这是与JavaFX 2游戏教程相关的六个部分系列的第四部分。 如果您错过了第1部分 &#xff0c; 第2部分或第3部分 &#xff0c;我建议您在开始本教程之前仔细阅读它们。 回顾一下&#xff0c;在第3部分中&#xff0c;我为您提供了许多经典街机风格游戏以及所使用的不同…

mysql 实体类_Mysql生成实体类

-- 查询数据表结构SELECTCONCAT(‘"e.‘,SUBSTRING(COLUMN_NAME,1),‘,"‘),COLUMN_NAME,‘,‘,COLUMN_TYPE,column_commentFROMINFORMATION_SCHEMA.COLUMNSWHERE table_schema ‘xcb‘and table_name ‘t_product‘;-- 生成Java实体类SELECTCONCAT(‘Column(name&…

vue 兄弟组件之间的传值

1. 定义一个公共的bus.js //bus.js import Vue from vue export default new Vue()2. 在子组件A里用$emit发射数据 <script> // 引入公共的bug&#xff0c;来做为中间传达的工具 import Bus from ./bus.js export default {methods: {details(data) {//发射组件A的数据…

Java 8:声明接口中的私有方法和受保护的方法

引入Java 8时&#xff0c;我们可以在接口中使用默认方法。 此功能的主要驱动程序是允许扩展接口&#xff0c;同时保留对旧接口版本的向后兼容性。 一个示例是在现有Collection类中引入stream()方法。 有时&#xff0c;当我们想引入几种默认方法时&#xff0c;它们可能共享一些…

sysbench 1.0.6 mysql_Sysbench 测试mysql数据库性能(version:sysbench-1.1.0)

继上面安装完Mysql rpm 安装之后需要用sysbench对数据库进行性能测试&#xff1a;下载git clone https://github.com/akopytov/sysbench.git或者直接去github下载&#xff1a;https://github.com/akopytov/sysbench安装前准备除了上面Mysql rpm 安装提到的需要安装的四个rpm&am…

elementUI vxe-table结合使用(通用表格)

App.vue 样式 .my-main{margin: 20px; } .dfc{display: flex;flex-direction: column; } .dfr{display: flex;flex-direction: row; } .f1{flex: 1; } .fl{float: left; } .fr{float: right; } .baseColor{background-color:RGB(48,65,86);color:#fff; }父组件 <!-- --&g…