八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
该问题是国际西洋棋棋手马克斯·贝瑟尔于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
}

测试:

a算法解决八数码问题_javascript,八皇后问题解决相关推荐

  1. 广度优先算法解决8数码问题【c++】

    8数码问题 (广度优先算法解决----c++) 8数码问题问题描述 八数码问题也称为九宫问题,在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格(空格用0来表示),空格 ...

  2. Python实现A*算法解决N数码问题

    Python实现A*算法解决N数码问题 A*算法的描述 A*算法的步骤 问题描述 代码以及测试结果 算法优势 算法存在一些不足 A*算法的描述 A*算法是BFS的一个变种,它把原来的BFS算法的无启发 ...

  3. A*算法解决8数码问题python实现

    1.A*的通俗理解 很多游戏特别是rts,rpg类游戏,都需要用到寻路.寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高 ...

  4. python 八数码_python 处理八数码 双向BFS 拼图游戏 | 学步园

    我的代码一开始是单向的BFS 然后很慢,5分钟? 参照别人的代码后,改用双向BFS 很快 拼图问题 == 八数码问题 从开始状态start,进行BFS 同时,从结束状态end,进行BFS 如果左图能够 ...

  5. python解决八数码问题_A*算法解决15数码问题_Python实现

    1问题描述 数码问题常被用来演示如何在状态空间中生成动作序列.一个典型的例子是15数码问题,它是由放在一个4×4的16宫格棋盘中的15个数码(1-15)构成,棋盘中的一个单元是空的,它的邻接单元中的数 ...

  6. java编写八数码_java实现八数码

    [实例简介] 期末人工智能实验,有良好的界面和人性化的操作提示,做得不好别介意~仅提供一个参考而已 [实例截图] [核心代码] a48490c4-bae8-47e8-8e40-095628100c5b ...

  7. 【人工智能】八数码问题:广度搜索、深度搜索

    应用广度搜索BFS和深度搜索DFS解决八数码问题,广度搜索和深度搜索都是盲目搜索,相关理论知识,算法过程:问题求解:状态空间图和盲目搜索. 参考:7种方法求解八数码问题 Python实现A*算法解决N ...

  8. Python利用A*算法解决八数码问题

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790565 资源下载地址:https://download.csdn.net/downl ...

  9. 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现

    对经典算法的问题的回顾与感想 对八皇后问题和八数码问题分别用最陡上升爬山法.首选爬山法.随机重启爬山法.模拟退火算法来实现,并且分析他们的性能. 分析 要求实现的各个算法是有共同点的,比如,八皇后问题 ...

最新文章

  1. Linxu终端gcc与gcc -c的区别
  2. 直播|清华谢晓晖——面向互联网图像搜索的用户行为模型研究
  3. send和WSASend区别
  4. js实现元素水平垂直居中
  5. 要活多久才能赚回你交的养老金
  6. php静态变量的销毁
  7. CentOS 7关闭firewalld启用iptables
  8. mac 电脑android环境变量设置,mac上Android环境变量配置
  9. seo提交工具_经验分享:SEO新手面对新网站应该如何去优化
  10. 映射内网ftp服务器到公网报错问题解决
  11. DHCP之二 DHCP的中继代理
  12. ibatis java_iBatis.java
  13. SSM中使用注解方式调用输入输出参数存储过程,输入参数为javabean方式,Boolean类型对应TINYINT类型
  14. 团队作业4——第一次项目冲刺(Alpha版本) Day1
  15. 解读微信团队的七个价值观
  16. 常用的国产计算机软件,国产常用操作系统介绍,亲身使用告诉你答案!
  17. 3D打印切片软件支撑算法研究
  18. XTU OJ 湘潭大学
  19. 大数据综合案例-网站日志分析
  20. L2+/L3级智能驾驶功能量产,为何说侧向补盲激光雷达是必备传感器?

热门文章

  1. [渝粤教育] 西南科技大学 复习资料 法理学
  2. 通信距离与哪些因素相关?为什么模块通信距离和厂家宣传的不一样?
  3. mysql导出包_mysql导入导出包括函数或者存储过程
  4. renew process 更新过程
  5. 盲僧一键r闪用什么设置_美加狮R.A.T. PRO X3至尊版带你畅玩模拟飞行
  6. mt5 mysql数据库_Django -- 使用MySql数据库
  7. ASP.NET Core MVC 之过滤器(Filter)
  8. 云技术-SaaS架构初步理解
  9. 关于数据可视化页面制作
  10. 最常出现的字符串 Most Common Word