参考了csdn里的一篇文章(leetcode上没找到),他用C++写的, 双向bfs队列搜索。我把C++的代码改成了java,链接:https://blog.csdn.net/qq_45775045/article/details/112548439

实验任务:
1)对九宫重排问题,建立图的启发式搜索求解方法;
2)用A*算法求解九宫重排问题。

实验要求:
3х3九宫棋盘,放置数码为1~8的8个棋子,棋盘中留有一个空格,空格周围的棋子可以移动到空格中,从而改变棋盘的布局。根据给定初始布局和目标布局,移动棋子从初始布局到达目标布局,求解移动步骤并输出。请设计算法,使用合适的搜索策略,在较少的空间和时间代价下找到最短路径。

工具:IDEA  jdk1.8

总结:没有成功。。。敲了半天跑不动,无语了。

*****************

能跑了,字符交换后没有赋给原字符串,导致永远返回-1.还有个问题,起点和终点相等也会返回-1.

讲解:BFS:所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。java库的功能写的很多,很方便,但也不够纯粹了,栈

和队列看起来居然很相似。增删就有两种方法。对于这些功能选取合适的即可,其他忽视。

单向BFS太慢了,双向快很多。这里有几个细节,1.起点和终点的visited设置的值不同,这是为了最终前后相遇的判断。要不然无法判断什么时候找到。

2.方向数组,leetcode走几步就看到一堆,算是基本操作3.二维变一维,一维变二维,小技巧4.在赋visited值时用前一个位置的visited的值

代码有注释

代码如下:

import java.util.*;public class Rearrange{//双向BFS
public static String src_st;//九宫起点状态
public static String des_st;//九宫终点状态
public static Queue<String> queue =new ArrayDeque<>();
/*** 1.是否访问 2.起点或终点访问*/
public static Map<String,Integer> visited=new HashMap<>();
public static Map<String,Integer> depth=new HashMap<>(); //搜索深度
public static int dict[][]={{0,-1},{0,1},{1,0},{-1,0}};//方向数组(左右上下遍历)
public static int bfs() {queue.add(src_st);queue.add(des_st);while (!queue.isEmpty()) {String first = queue.peek();queue.poll();int curX = 0, curY = 0;for (int i = 0; i < first.length(); i++) {//定位空格位置(句点)if (first.charAt(i) == '.') {curX = i / 3;curY = i % 3;}}int newX, newY;for (int i = 0; i < 4; i++) {//四处逃窜newX = dict[i][0] + curX;newY = dict[i][1] + curY;if (newX >= 0 && newX <= 2 && newY >= 0 && newY <= 2) {//判断边界条件String new_st = first;char curtemp = new_st.charAt(curX * 3 + curY);char newtemp = new_st.charAt(newX * 3 + newY);new_st=  new_st.replace(curtemp, '-');//字符串交换字符new_st= new_st.replace(newtemp, curtemp);new_st=new_st.replace('-', newtemp);if (!visited.containsKey(new_st)) {//没遍历过visited.put(new_st, visited.get(first));depth.put(new_st, depth.get(first) + 1);queue.add(new_st);} else {/**              2           4        3* 遍历过了 1.起点回到起点 2.终点回到终点3.会和*/if (visited.get(first) + visited.get(new_st) == 3) {return  depth.get(first) + depth.get(new_st) + 1;}}}}}return -1;
}public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("请输入九宫起点字符串:");src_st=scanner.next();System.out.println("请输入九宫终点字符串:");des_st=scanner.next();visited.put(src_st,1);visited.put(des_st,2);depth.put(src_st,0);depth.put(des_st,0);int n=bfs();System.out.println("九宫重排搜索次数:"+"\t"+n);}
}

数据结构和算法 第二小题 九宫重排(1)相关推荐

  1. #数据结构与算法 第一小题 学生成绩档案管理系统

    写了一天,非常得没有效率,比较粗糙,注释不太丰富,但应该足以理解.强调:如有雷同,肯定被我参考了.不会写博客,以后会学习,这次就这样了.io参考链接:https://www.cnblogs.com/p ...

  2. 【恋上数据结构与算法 第二季】【04】图-基础实现_遍历_拓扑排序

    持续学习&持续更新中- 学习态度:脚踏实地 [恋上数据结构与算法 第二季][04]图-基础实现_遍历_拓扑排序 图的实现方案 邻接矩阵 邻接表 图的基础接口 顶点.边的定义 图的基础实现 图的 ...

  3. 数据结构与算法 第二次实验报告堆栈队列

          数据结构与算法 第二次实验报告 姓名:许恺 学号:2014011329 班级:计算机14-1 中国石油大学(北京)计算机科学与技术系 前     言 <数据结构>是计算机及相关 ...

  4. 2021年春季学期-信号与系统-第十四次作业参考答案-第二小题参考答案

    本文是 2021年春季学期-信号与系统-第十四次作业参考答案 中各小题的参考答案. §02 第二小题 2.x[n]x\left[ n \right]x[n]如下图所示,试绘出解答: (1) x[n]x ...

  5. 2021年春季学期-信号与系统-第十五次作业参考答案-第二小题参考答案

    本文是 2021年春季学期-信号与系统-第十五次作业参考答案 中各小题的参考答案. §02 第二小题 2.如果希望通过DFT获得吉他每个琴弦的频谱特性,希望频谱分析的最大范围是20kHz,频谱分辨率为 ...

  6. python可以在多种平台运行、体现了_2020年智慧树数据结构与算法第二单元章节测试答案...

    2020年智慧树数据结构与算法第二单元章节测试答案 更多相关问题 为了寻找和选择通讯的报道对象,当你获知省教育招生考试院发布了<关于调整普通高等教育专科升本科考试录取办法的通知>后,应该熟 ...

  7. 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题

    横空出世,席卷互联网                      ---评微软数据结构+算法面试100题 作者:July. 时间:2010年10月-11月.版权所有,侵权必究. 出处:http://bl ...

  8. 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题 .

    入 编程这一行之初,便常听人说,要多动手写代码.可要怎么写列?写些什么列?做些什么列? c语言程序设计100例,太过基础,入门之后,挑战性不够.直接做项目,初学者则需花费大量的时间与精力.且得有一定能 ...

  9. 数据结构与算法基础--错题集

    数据结构与算法的定义 数据结构是一门研究非数值计算的程序设计问题中的操作对象以及它们之间的关系和运算的学科. 算法是:解决问题的有限运算序列 算法分析的两个主要方面是:空间复杂度和时间复杂度 算法分析 ...

最新文章

  1. Spring Boot 3.0 M1 发布,正式弃用 Java 8,最低要求 Java 17。。。
  2. 《Ember.js实战》——2.3 计算属性
  3. 福利 | 如何创造可信的AI?人工智能大牛盖瑞·马库斯的11条建议
  4. java servlet https_javaweb项目对https的配置01
  5. 如何使用Google Analytics(分析)设置和跟踪YouTube频道的效果
  6. 使用 Github 作为专用 Nuget 包服务器并共享您的包
  7. Python之pyclipper使用
  8. java Beanutils.copyProperties( )用法
  9. Linux下使用润乾设计器
  10. GitHub上20多万张不可描述图片的数据集
  11. java语言就业方向_java就业有哪些方向
  12. 临终关怀?抑或一切照旧?PR咋又更新了?
  13. java中dvd管理系统_一个DVD管理系统
  14. Python中%的作用
  15. 数学建模进入“新课标”,告别了“刷题”“押题”数学应该怎么学?
  16. 崩溃,80后千万富翁名单
  17. 全域赋能和智慧全球,阿里巴巴大数据技术前瞻与案例
  18. 在使用Less除法运算时,报错(css不出结果)
  19. Python_机器学习_算法_第4章_4.决策树算法
  20. 关心你周末生活的也只有码仔了

热门文章

  1. 大数据鹏飞时代,这些商机你掌握了吗
  2. 搜索引擎技术原理及其应用
  3. Spring项目,项目启动执行方法且执行一次。
  4. LinuxC++:网络编程(一)最原始服务端及客户端代码实现和函数释义
  5. Dubbo的使用和原理
  6. HashMap 是如何工作的?图文详解,一起来看看!
  7. vue keep-alive 缓存 不生效解决方案
  8. idea中删除的东西如何找回来
  9. 深度学习视觉领域中的attention机制的汇总解读(self-attention、交叉self-attention、ISSA、通道注意、空间注意、位置注意、Efficient Attention等)
  10. Java中“...“的含义