蓝桥杯 java 跳马问题
问题描述
一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?
输入格式
一行四个数字a,b,c,d。
输出格式
如果跳不到,输出-1;否则输出最少跳到的步数。
核心思想:BFS算法(宽搜)
(不讲解bfs算法,大家可以去b站基本了解,有助于看懂下面的思想和代码)不怕你学不会系列:宽度优先搜索_哔哩哔哩_bilibili宽度优先搜索基本思想https://www.bilibili.com/video/BV1H44y1871A/?spm_id_from=autoNext 使用原因有二:
一:马有8步选择,不清楚第几步选择,第几次走8步可以到达目标值,所以本质上需要遍历所有结果,也就是要么bfs(深度搜索)要么bfs(宽度搜索)。前者适合解决的是所有路径,后者解决的则是最短路径,所以这里用bfs算法更好
二:使用的是队列,dfs算法用的是栈,bfs算法用的是队列,两者的区别就是后者是先进先出,那么,我根据当前遍历的值,比如说是(1,1)找到它下八个值之后,我就要把(1,1)弹出去,指针指向下一位(也即是(1,1)下八个值的第一个值,比如是(2,3))。这样保证我们能遍历完所有的值。
程序思想:
1.接受初始步a,b 终点步 c,d
2.判断a ,b 和c,d 是否相等。是就直接输出,螺旋上天。
3.bfs算法求解最短路径
3.1声明两个计数器,一个表示马真正走了多少步,一个表示队列存了多少种(未计算下一步的)坐标。
3.2循环,每次都拿队列第一个数来求出八种坐标,并且判断是否我们要的结果,是就步数计数器+1,直接返回,跳出循环。不是就把这个坐标存到队列中,以后还得拿来求它的下一八步嘞。存完之后,队列计数器也要加一,并且存完八个,队列第一个数就没用了,要弹出,给下一个数空间。
代码如下:
import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;public class Main01 {//跳马问题//BFS +算法//八行两列的马步。static int[][] ma = {{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{-2,1},{2,-1},{-2,-1}};public static void main(String[] args) {Scanner in = new Scanner(System.in);int a = in.nextInt();int b = in.nextInt();int c = in.nextInt();int d = in.nextInt();//ab,初始坐标。cd终点坐标。tiaoma(a, b, c, d);}static void tiaoma(int a, int b,int c, int d){//初始化队列Deque<int[]> B = new LinkedList<>();B.offer(new int[]{a,b});//计数器int cout = 0;int incout =0;//第0步if (a == c && c == d) {System.out.println(cout);return;}//第n步while (true){for(int[] i : ma) {//临时数组int[] at = new int[2];at[0] = B.getFirst()[0]+i[0];at[1] = B.getFirst()[1]+i[1];//如果是目标值,就直接返回if(Arrays.toString(at).equals(Arrays.toString(new int[]{c, d}) )){System.out.println(cout+1);return;}//不是就存入.并且内部计数器+1B.offer(at);incout+=1;//如果存入的数据够了,就让外部计数器+1if (Math.pow(8,cout+1)==incout){cout+=1;}} //循环一次之后,新八值就找到了,那么可以弹栈了B.pollFirst();}}
}
结果(还是很美的)
(这里插几句,为什么不考虑负数的情况,不考虑出界的问题,emmm出界问题确实没考虑。负数的情况就是(1,1)下一步(-1,0)在棋盘上不存在,但是(-1,0)下一步(0,2)回来了,还跑到别的地方去了,那么这到底算可以还是不可以捏?其实你把棋盘化成坐标轴,你会发现它是对称的,也就是如果它真的能走回来,并且走到我们要的答案,那么一定也会有对称的,同样的步数,并且一直在棋盘内的走法,也能走到目标值,所以跑到外界去了,问题不大)
如图:
蓝桥杯 java 跳马问题相关推荐
- 蓝桥杯java备赛Day3——跳马
蓝桥杯java备赛A组--跳马 问题描述 问题描述: 一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步? 输入格式: a,b,c,d 输出格式: ...
- java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)
第七届蓝桥杯JAVA B组真题解析-凑算式(第三题) 凑算式 A+B/C+DEF/GHI =10 (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. ...
- 蓝桥杯Java历年真题与答案_蓝桥杯大赛java历年真题及答案整理(闭关一个月呕心沥血整理出来的)...
蓝桥杯大赛java历年真题及答案整理(闭关一个月呕心沥血整理出来的) 1蓝桥杯 java 历年真题及答案整理(闭关一个月,呕心沥血整理出来的)1. 算法是这样的,如果给定 N 个不同字符,将这 N 个 ...
- 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 ...
- 2018年 第09届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2019年 第10届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...
- 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
最新文章
- Javascript模板引擎handlebars使用实例及技巧
- 人工智能 | 自动驾驶与人工智能前沿研究报告(应用篇)
- git创建/合并分支/删除分支/将修改后的内容同步到GitHub远程仓库
- 逻辑漏洞-找回密码修改返回包
- R开发(part1)--R语言知识体系结构
- Atom常用功能插件
- python构建矩阵 x y_生成Python函数一半没问题,当前最正统的代码生成是什么样的?...
- android中的BitMap(二)从网络和资源文件中获得一个BitMap
- iOS开发——高级技术通讯录功能的实现
- 深圳人才引进,大学生,公司的福利
- SQL Server 2019安装教程(图文)
- 微信小程序 webview 传递URL中含有特殊字符-,=
- GDAL读写矢量文件——C#
- php为什么要创建类,php – 是否有理由为单一功能创建类?
- dell 服务器ghost系统,Dell 5000笔记本装win7 64位Ghost系统真正成功教程
- eps导入坐标文件_EPS一些简单地物的编辑
- SetupFactory安装前卸载旧版本
- 大数据高级开发工程师——大数据相关工具之三 Maxwell
- react-native 创建新的项目
- TX云虽然是大企业但其实让我有些难过