位置: IT常识 - 正文

day53-马踏棋盘(马踏棋盘游戏规则)

编辑:rootadmin
马踏棋盘 1.算法优化的意义 算法是程序的灵魂,为什么有些程序可以在海量数据计算时,依旧保持高速计算? 编程中算法很多,比如八大排序算法(冒泡、选择、插入、快排、归并、希尔、基数、堆排序)、查找算法、分治算法、动态规划算法、KMP算法、贪心算法、普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算 ... 马踏棋盘1.算法优化的意义算法是程序的灵魂,为什么有些程序可以在海量数据计算时,依旧保持高速计算?编程中算法很多,比如八大排序算法(冒泡、选择、插入、快排、归并、希尔、基数、堆排序)、查找算法、分治算法、动态规划算法、KMP算法、贪心算法、普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法下面以骑士周游问题为例,体验算法优化程序的意义,感受算法的威力2.骑士周游问题马踏棋盘算法介绍和游戏演示马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8*8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则移动(马只能走日字)。要求每个方格只进入一次,走遍棋盘上全部64个方格会使用到图的遍历算法(DFS)+贪心算法优化

推荐整理分享day53-马踏棋盘(马踏棋盘游戏规则),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:马踏棋盘需求分析,马踏棋盘的算法复杂度是多少,马踏棋盘需求分析,马踏棋盘8x8所有结果,马踏棋盘游戏规则,马踏棋盘图论解法,马踏棋盘多少种走法,马踏棋盘游戏规则,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

这里我们先用基本的方法解决,然后使用贪心算法(greedyalgorithm)进行优化。解决马踏棋盘问题,体会到不同的算法对程序效率的影响

3.思路分析day53-马踏棋盘(马踏棋盘游戏规则)

创建一个棋盘chessBoard,是一个二维数组将马儿当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(ArrayList),每一个位置的下一步最多有8个方向,每走一步,就使用step+1遍历ArrayList中存放的所有位置,看看哪个可以走,如果可以走通,就继续,走不通,就回溯判断马儿是否完成了任务,使用step和应该走的步数比较,如果没有达到数量,则表示没有完成任务,将整个棋盘设置为0

注意:马儿走的策略不同,得到的结果也会不一样,效率也不一样。

package li;import java.awt.*;import java.util.ArrayList;/** * @author 李 * @version 1.0 * 马踏棋盘 */public class HorseChessBoard { //定义属性 private static int X = 6;//表示col-列 private static int Y = 6;//表示row-行 private static int[][] chessBoard = new int[Y][X];//棋盘 private static boolean[] visited = new boolean[X * Y];//表示记录某个位置是否走过 private static boolean finished = false;//记录马儿是否遍历完棋盘 public static void main(String[] args) { //测试 int row = 2; int col = 2; long start = System.currentTimeMillis(); traversalChessBoard(chessBoard, row-1, col-1, 1);//将棋盘上开始的位置设置为起始第一步 long end = System.currentTimeMillis(); System.out.println("遍历耗时="+(end - start)); //输出当前棋盘的情况 for (int[] rows : chessBoard) { for (int step : rows) {//step表示 这个位置是马儿应该走的第几步 System.out.print(step + "\t"); } System.out.println(); } } //最核心的算法,遍历棋盘,如果遍历成功,就将finished的值设置为true, //并且将马儿走的每一步step记录到chessBoard public static void traversalChessBoard(int[][] chessBoard, int row, int col, int step) { //先将step记录到chessBoard chessBoard[row][col] = step; //把这个位置设置为已经访问 visited[row * X + col] = true;//就是将二维数组的下标对应到一位数组下标,按行的顺序存放(注意下标从0开始) //获取当前位置可以走的下一个位置有哪些 ArrayList<Point> ps = next(new Point(col, row));//注意col-X,row-Y //遍历 while (!ps.isEmpty()) { //取出当前ps集合的第一个位置(点) Point p = ps.remove(0);//每取出一个点,就从集合中删除这个点 //判断该点的位置是否走过,如果没有走过,就递归遍历 if (!visited[p.y * X + p.x]) { //递归遍历 traversalChessBoard(chessBoard, p.y, p.x, step + 1); } } //当退出while循环后,看看是否遍历成功,如果没有成功,就重置相应的值,然后进行回溯 if (step < X * Y && !finished) { //重置 chessBoard[row][col] = 0; visited[row * X + col] = false; } else { finished = true; } } //编写方法,可以获取当前位置 可以走的下一步 的所有位置(Point表示x,y) public static ArrayList<Point> next(Point curPoint) {//curPoint表示当前点 //先创建一个ArrayList ArrayList<Point> ps = new ArrayList<>(); //创建一个Point对象,表示一个位置/点,准备放入到 ps集合中 Point p1 = new Point(); //判断在curPoint位置,是否可以走如下位置,如果可以走,就将该点(p1)放入到集合ps中 /** * 马走日的话,每个点就有八个方向可以走,并且这八个方向对于当前坐标的相对坐标都是固定的, * 通过当前坐标算出八个方向的相对坐标,然后排除掉那些可能会走出界的方向 */ //判断是否可以走5位置 if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y - 1) >= 0) { ps.add(new Point(p1));//要创建一个新的点 } //判断是否可以走6位置 if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y - 2) >= 0) { ps.add(new Point(p1));//要创建一个新的点 } //判断是否可以走7位置 if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y - 2) >= 0) {//注意索引的范围是:0到X-1 ps.add(new Point(p1));//要创建一个新的点 } //判断是否可以走0位置 if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y - 1) >= 0) { ps.add(new Point(p1));//要创建一个新的点 } //判断是否可以走1位置 if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y + 1) < Y) { ps.add(new Point(p1));//要创建一个新的点 } //判断是否可以走2位置 if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y + 2) < Y) { ps.add(new Point(p1));//要创建一个新的点 } //判断是否可以走3位置 if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y + 2) < Y) { ps.add(new Point(p1));//要创建一个新的点 } //判断是否可以走4位置 if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y + 1) < Y) { ps.add(new Point(p1));//要创建一个新的点 } return ps; }}

4.优化

根据上面的代码,当前点走的下一个位置,是按照我们的顺时针方向来挑选位置的,因此,所选择的点的下一个可以走的位置的个数是不确定的优化的思路是:我们应该优先选择的下一个位置,这个位置的再下一个位置应该尽可能少,这样就可以减少回溯的次数代码:对ps集合按照可以走的下一个位置的次数进行升序排序(从小到大排序)

修改:

编写方法//写一个方法,对ps集合的各个位置,可以走的下一个位置的次数进行排序,把可能走的下一个位置从小到大进行排序public static void sort(ArrayList<Point> ps){ ps.sort(new Comparator<Point>() { @Override public int compare(Point o1, Point o2) { return next(o1).size()-next(o2).size(); } });}在递归中调用该方法,对ps集合按照可以走的下一个位置的次数进行升序排序(从小到大排序)

优化结果:

本文链接地址:https://www.jiuchutong.com/zhishi/312992.html 转载请保留说明!

上一篇:织梦中英文站点英文分页修改的方法(织梦58符老师亲测)(织梦网站怎么改logo)

下一篇:dedecms织梦获取栏目(分类)的文章数量的方法(织梦使用教程)

  • 央视频缓存的视频在手机什么位置(央视频缓存的视频怎么保存到手机)

    央视频缓存的视频在手机什么位置(央视频缓存的视频怎么保存到手机)

  • 12306上订餐是送到座位上吗(12306订餐)

    12306上订餐是送到座位上吗(12306订餐)

  • 抖音可以知道谁分享了吗(抖音可以知道谁收藏了我的视频吗)

    抖音可以知道谁分享了吗(抖音可以知道谁收藏了我的视频吗)

  • 小米悬浮键盘怎么关闭(小米悬浮键盘怎么设置)

    小米悬浮键盘怎么关闭(小米悬浮键盘怎么设置)

  • 取卡针插到麦克风孔(取卡针插到麦克风里面)

    取卡针插到麦克风孔(取卡针插到麦克风里面)

  • 苹果8p无线充电怎么用(苹果8p无线充电功能怎么打开)

    苹果8p无线充电怎么用(苹果8p无线充电功能怎么打开)

  • 腾讯王卡免流不支持苹果手机(腾讯王卡免流不包括微信么)

    腾讯王卡免流不支持苹果手机(腾讯王卡免流不包括微信么)

  • 笔记本电脑怎么安装软件到桌面(笔记本电脑怎么恢复出厂设置)

    笔记本电脑怎么安装软件到桌面(笔记本电脑怎么恢复出厂设置)

  • qq一共有多少个字符(qq一共有多少个普通字符)

    qq一共有多少个字符(qq一共有多少个普通字符)

  • oppoa5怎么设置指纹锁屏密码(oppoa5怎么设置指纹支付密码)

    oppoa5怎么设置指纹锁屏密码(oppoa5怎么设置指纹支付密码)

  • 华为滤镜在哪里开(华为手机的滤镜功能在哪里)

    华为滤镜在哪里开(华为手机的滤镜功能在哪里)

  • 手机普拉斯是什么意思(什么叫普拉斯)

    手机普拉斯是什么意思(什么叫普拉斯)

  • 中国移动卡怎么升级5g(中国移动卡怎么激活使用)

    中国移动卡怎么升级5g(中国移动卡怎么激活使用)

  • 怎样在电脑上下载微信(怎样在电脑上下载软件)

    怎样在电脑上下载微信(怎样在电脑上下载软件)

  • 华为怎样修复微信聊天记录(如何修复华为手机微信聊天记录)

    华为怎样修复微信聊天记录(如何修复华为手机微信聊天记录)

  • 网线直接连接路由器能用吗(网线直接连接路由器速度会降吗)

    网线直接连接路由器能用吗(网线直接连接路由器速度会降吗)

  • 微信群提示被用户投诉为什么(微信群提示被用户投诉涉嫌传播欺诈一定是有人投诉吗)

    微信群提示被用户投诉为什么(微信群提示被用户投诉涉嫌传播欺诈一定是有人投诉吗)

  • 微型机的dos系统属于(微机dos属于)

    微型机的dos系统属于(微机dos属于)

  • 10gb的硬盘是多少字节(10gb硬盘储存容量)

    10gb的硬盘是多少字节(10gb硬盘储存容量)

  • 知道抖音号怎么登录(知道抖音号怎么查手机号)

    知道抖音号怎么登录(知道抖音号怎么查手机号)

  • 苹果11怎么设置面容支付(苹果11怎么设置铃声)

    苹果11怎么设置面容支付(苹果11怎么设置铃声)

  • 华为free lace耳机怎么充电(华为freelace耳机怎么配对)

    华为free lace耳机怎么充电(华为freelace耳机怎么配对)

  • 三星s8唤醒屏幕设置(三星s8唤醒功能在哪里?)

    三星s8唤醒屏幕设置(三星s8唤醒功能在哪里?)

  • 手机怎么连接车载视频(手机怎么连接车机系统)

    手机怎么连接车载视频(手机怎么连接车机系统)

  • 搜狗输入法如何输入繁体字(搜狗输入法如何关闭键盘声音)

    搜狗输入法如何输入繁体字(搜狗输入法如何关闭键盘声音)

  • 电脑管家怎么重装系统(电脑管家怎么重新安装)

    电脑管家怎么重装系统(电脑管家怎么重新安装)

  • 森佩尔森林公园中的黑海杜鹃,德国吕根岛 (© Sandra Bartocha/Minden Pictures)(森佩塑胶)

    森佩尔森林公园中的黑海杜鹃,德国吕根岛 (© Sandra Bartocha/Minden Pictures)(森佩塑胶)

  • 分公司可以享受企业所得税优惠吗
  • 进项税额转出的例题
  • 转让股份的印花税怎么交
  • 居民个税和非居民个税哪个高
  • 个税手续费返还比例
  • 计提利息收入分录怎么写
  • 视同销售的销售额如何确定
  • 资产负债表其他应付款计算公式
  • 固定资产改变用途进项转出
  • 救灾捐赠会计分录
  • 劳务所得税税率表最新
  • 出口的进项发票如何记账
  • 加计扣除农产品包括哪些
  • 增值税普通发票几个点
  • 清包工程增值税税率
  • 未按规定订立无固定期限劳动合同
  • 转账户有误退回会计处理
  • 营业额和营业收入怎么填写
  • 暂估成本后第二年收到发票怎么做账
  • 金蝶是先过账还是先审核
  • 基建工程的各项工作包括
  • 企业的税收筹划
  • 小企业成本核算方法移动加权平均法
  • 笔记本怎么按出键盘
  • 金蝶系统怎么修改库存数量
  • pruttct.exe - pruttct是什么进程 有什么用
  • vue项目页面写在哪里
  • 带着崽崽宠老公免费阅读
  • 来料加工的账务处理
  • php+mysql+ajax实现单表多字段多关键词查询的方法
  • 购入商品再卖出
  • 提交表单后重定向
  • php运算符@符号
  • 购买垃圾桶计入什么科目
  • 去年发生了什么
  • python for循环遍历
  • 最常用的成本核算表格
  • 如何确定固定资产是否已经发生减值
  • 债券承销费是指什么费用
  • 公司首次申报个人所得税
  • 临时工和正式工工资不一样违法吗
  • 印花税会计处理办法
  • 年末已经结账了怎么入账
  • 土地免缴土地使用税
  • 不得扣除的税金啥意思
  • 弥补以前年度亏损报表怎么填
  • 实收资本收到后用途
  • 行政事业单位其他收入
  • 不开票收入怎么报税
  • 收到红字发票如何入账
  • 公司员工报销油费
  • 一般纳税人提供劳务税率是多少
  • 分公司是否需要独立核算
  • 医疗机构药库设置标准
  • win8.1升级win10系统
  • 注册表出错打不开程序
  • wp8.1怎么升级wp10
  • xp 跳过 chkdsk
  • linux系统中安装web服务
  • 内核版本能升级吗
  • win7系统桌面图标变大了怎样恢复
  • mac os 如何备份
  • windows7升级到win8
  • 电脑kernel32.dll
  • windows听歌软件
  • win8.1c盘满了怎么办
  • win8鼠标指针不见了
  • windows预览0x80072ee7
  • Unity3D游戏开发培训课程大纲
  • bat脚本延迟执行命令
  • python2.7和3.8
  • 详细解读了
  • unityugui
  • javascript基础
  • 个体工商户税务申报怎么操作流程
  • 国税地税发票编码查询
  • 江西国税电子税务局
  • 增值税差额征税什么意思
  • 增值税普票十万怎么开
  • 中国税务报订阅电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设