马踏棋盘算法介绍和游戏演示

1.马踏棋盘算法也被称为骑士周游问题

2.将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格

3.游戏演示: 马踏棋盘_马踏棋盘html5游戏在线玩_4399h5游戏-4399在线玩

马踏棋盘游戏代码实现

1.马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。

2.如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了53个点,如图:走到了第53个,坐标(1,0),发现已经走到尽头,没办法,那就只能回退了,查看其他的路径,就在棋盘上不停的回溯…… ,思路分析+代码实现

3.分析第一种方式的问题,并使用贪心算法(greedyalgorithm)进行优化。解决马踏棋盘问题.

4.使用前面的游戏来验证算法是否正确。

/****骑士周游问题1.创建周游问题的解决步骤和思路2.将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中,最后有8个位置,每走一步,就使用step+13.遍历list中存放的所有位置,看看哪个位置可以走通,如果走通,就回溯4.判断马儿是否完成了任务,使用step和应该走的步数比较,如果没有达到数量,则表示没有完成任务,将整个棋盘置0注意:马儿不同的走法(策略),会得到不同的结果,效率也有影响(优化),注意:如果不用贪心算法进行优化,计算步骤会十分庞大导致js线程卡死,马踏棋盘问题和迷宫问题不一样,马踏棋盘算法中一个点可能会走很多次,而迷宫问题中一个点只会走一次所以马踏棋盘算法的计算量要大的多使用贪心算法进行优化1.我们获取当前位置,可以走的下一个位置的集合ps2.我们需要对ps中所有的point下一步的所有集合的数目,进行非递减排序,其实就是递增
优化的原因,我们优先选择所有的下一个位置的选择的位置最小的那个,
可以减少回溯假设我们每一个马儿位置,有n个位置可以继续走,我们此时不知道这n个位置能否成功走完棋盘,那么
设每个位置的完成概率是相等的p(n*p=1),但是我们可以确定每个位置的完成时间
(完成时间=成功时间*成功概率+失败时间*失败概率,成功时间,成功概率和失败概率是相等的,但是失败时间不等)
大小,n个位置的完成时间,依次为t1,t2,...tn,.....,
此时我们可以看到走n1和n2位置成功与走n3和n4的总成功率是相等的,但是总完成时间是不等,
我们为了效率,在获取相同成功率的情况下,总完成时间越短则效率越高***/class HorseChessboard {x;//棋盘的列数y;//棋盘的行数visited = [];//创建一个数组,标记棋盘的各个位置是否被访问过//使用一个属性,标记是否棋盘的所有位置都被访问过finished;constructor() {}//我们需要对ps中所有的point下一步的所有集合的数目,进行非递减排序,其实就是递增sort = (o1, o2) => {//获取到o1的下一步的所有位置个数let count1 = this.next(o1).length;//获取到o2的下一步的所有位置个数let count2 = this.next(o2).length;if (count1 < count2) {return -1;} else if (count1 == count2) {return 0;} else {return 1;}}/*** 完成骑士周游问题的算法* @param {棋盘} chessboard * @param {马儿当前位置的行,初始为0} row * @param {马儿当前位置的列,初始为0} col * @param {第第几步,初始位置为1} step */traversalChessboard(chessboard, row, col, step) {chessboard[row][col] = step;this.visited[row * this.x + col] = true;//标记为已访问//获取当前位置可以走的下一个位置的集合let ps = this.next(new Point(col, row));//贪心算法优化,对ps中所有的point下一步的所有集合的数目,进行非递减排序,其实就是递增ps.sort(this.sort);//遍历pswhile (ps.length > 0) {//取出下一个可以走的位置let p = ps.shift();//判断该点是否已经访问过if (!this.visited[p.y * this.x + p.x]) {//还没访问过this.traversalChessboard(chessboard, p.y, p.x, step + 1);}}//判断马儿是否完成了任务//如果没有达到数量,则表示没有完成任务,将整个棋盘置0//说明:step < this.x * this.y成立的情况有两种//1.棋盘到目前位置,棋盘没有走完//2。棋盘处于一个回溯过程if (step < this.x * this.y && !this.finished) {chessboard[row][col] = 0;this.visited[row * this.x + col] = false;} else {this.finished = true;}}/*** 根据当前位置,计算马儿还能走哪些位置,最多有8个位置* @param {*} curPoint */next(curPoint) {let list = [];let p1 = new Point();//1.表示马儿可以走左二上一这个位置if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y - 1) >= 0) {list.push(new Point(p1.x, p1.y));}//2.判断马儿可以走左一上二if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y - 2) >= 0) {list.push(new Point(p1.x, p1.y));}//3.判断马儿可以走右一上二if ((p1.x = curPoint.x + 1) < this.x && (p1.y = curPoint.y - 2) >= 0) {list.push(new Point(p1.x, p1.y));}//4.表示马儿可以走右二上一if ((p1.x = curPoint.x + 2) < this.x && (p1.y = curPoint.y - 1) >= 0) {list.push(new Point(p1.x, p1.y));}//5.表示马儿可以走右二下一if ((p1.x = curPoint.x + 2) < this.x && (p1.y = curPoint.y + 1) < this.y) {list.push(new Point(p1.x, p1.y));}//6.表示马儿可以走右一下二if ((p1.x = curPoint.x + 1) < this.x && (p1.y = curPoint.y + 2) < this.y) {list.push(new Point(p1.x, p1.y));}//7.表示马儿可以走左一下二if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y + 2) < this.y) {list.push(new Point(p1.x, p1.y));}//8.表示马儿可以走右二下一if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y + 1) < this.y) {list.push(new Point(p1.x, p1.y));}return list;}
}//点坐标
class Point {x;y;constructor(x, y) {this.x = x;this.y = y;}
}//测试骑士周游算法
let x = 8, y = 8;
let test = new HorseChessboard();
test.x = x;
test.y = y;let row = 1;//马儿初始位置的行,1
let column = 1;//马儿初始位置的列,1
//创建棋盘
let chessboard = new Array(y);
for (let i = 0; i < y; i++) {chessboard[i] = new Array(x).fill(0);
}
test.visited = new Array(x * y).fill(false);
test.traversalChessboard(chessboard, row - 1, column - 1, 1);
//输出棋盘
console.log('棋盘走的步骤:', chessboard);
console.log(test);

测试:

残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...相关推荐

  1. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...

  2. 用贪心算法解决马踏棋盘问题

    用贪心算法解决马踏棋盘问题 参考文章: (1)用贪心算法解决马踏棋盘问题 (2)https://www.cnblogs.com/Allen-win/p/7095293.html 备忘一下.

  3. 骑士周游(马踏棋盘)问题

    1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...

  4. 马踏棋盘问题的程序c语言,C语言马踏棋盘

    问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次, ...

  5. Java对马踏棋盘问题(骑士周游问题)的实现

    14.10.2 马踏棋盘游戏代码实现 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个 ...

  6. c语言马踏棋盘编程分析,C语言马踏棋盘实现

    原标题:C语言马踏棋盘实现 问题描述 国际象棋的棋盘为8×8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动 ...

  7. 【数据结构与算法】马踏棋盘(骑士周游世界)算法

    一,基本介绍 1)马踏棋盘算法也称为骑士周游问题 2)将马随机放在国际象棋的8 × 8棋盘Board[0~7] [0~7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋 ...

  8. 马踏棋盘---c语言

    问题描述: 国际象棋的棋盘为8x8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次 ...

  9. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析

    马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...

最新文章

  1. 中间省略_手机号码中间4位设置为*号,我用了5小时,可同事8秒就搞定了
  2. layui循环数据并渲染_layui使用表格渲染获取行数据的例子
  3. 乾坤 微前端_前端优秀资源整理(持续更新~)
  4. 如何在Outlook中的电子邮件上显示快速操作按钮
  5. pip 设置超时时间_Python pip使用超时问题解决方案
  6. Java h264起始码_h.264 – 使用H264视频的起始码
  7. Python入门方法--简单总结+学习方式思考
  8. vs运行html没有注册类,解决win10运行com提示“错误代码 80040154-没有注册类”的方法...
  9. sublime Text3下sass环境配置(windows)
  10. CSS3 过渡 transition
  11. jieba 结巴分词详解
  12. Linux(ubuntu 18)上编译 及修改 INAV 飞控代码(混控功能)
  13. java中的Stack解析
  14. MySQL 日期字段时间加 1 毫秒
  15. 放大器的传递函数_运放全差分放大器实现单端与平衡的相互转换
  16. java处理 mysql中json类型
  17. Windows下Ubuntu子系统,开启复制粘贴功能方法
  18. N76E003AT20筋膜枪单片机设计方案
  19. Thunderbolt4,雷电4与USB4
  20. web表格CSS 属性

热门文章

  1. 《计算机组成与体系结构:性能设计》读后小记 18、多核计算机
  2. Ajax Control Toolkit 34个服务器端控件 详解
  3. 87.VGA 88.FPGA
  4. Cortex-A、Cortex-R、Cortex-M处理器的性能比较
  5. SLAM:现在,未来和鲁棒感知时代
  6. 揭密 extern C
  7. 关于bhuman文件结构
  8. 基于OpenCV高斯模型的公共场景人流量统计
  9. java如何將數組反轉_Java基礎練習題 (4)數組操作
  10. MATLAB在温室中的应用,基于MATLAB的日光温室内气温的图形显示方法与流程