隐式图的搜索问题(九宫重排)——项目实现

  • 隐式图的搜索问题(九宫重排)——项目实现
    • 源代码
    • 运行结果

隐式图的搜索问题(九宫重排)——项目实现

源代码

package SearchPath;public class test {public static void main(String[] args) {Database database = new Database();SearchPath searchPath = new SearchPath(database);searchPath.insertFirst();}
}
package SearchPath;public class Node {private int status[];private int parent[];public int[] getParent() {return parent;}public void setParent(int[] parent) {this.parent = parent;}public int[] getStatus() {return status;}public void setStatus(int[] status) {this.status = status;}private int g;private int h;public void setH(int h) {this.h = h;}public int getG() {return g;}public void setG(int g) {this.g = g;}public int getF() {return g + h;}}
package SearchPath;import java.util.ArrayList;
import java.util.List;public class Database {private List<Node> nodeList = new ArrayList<>();private List<Node> closeList = new ArrayList<>();private List<Node> changeList = new ArrayList<>();private List<Node> pathList = new ArrayList<Node>();public Database() {}public List<Node> getPathList() {return pathList;}public List<Node> getCloseList() {return closeList;}public List<Node> getOpenList() {return nodeList;}public List<Node> getChangeList() {return changeList;}
}
package SearchPath;import java.util.Arrays;
import java.util.List;public class NodeDao {private List<Node> openList;private List<Node> closeList;private List<Node> changeList;private List<Node> pathList;public List<Node> getPathList() {return pathList;}public List<Node> getOpenList() {return openList;}public NodeDao(Database database) {this.openList = database.getOpenList();this.closeList = database.getCloseList();this.changeList = database.getChangeList();this.pathList = database.getPathList();}/*** 写入open表* @return*/public void insertOpenList(Node node) {openList.add(node);}/*** 写入close表*/public void insertCloseList(Node node) {closeList.add(node);openList.remove(node);}/*** 对open表按f(n)由小到大排序*/public void sort() {bubbleSort(openList);}/***冒泡排序*/public void bubbleSort(List<Node> list){for (int i = 0; i < list.size(); i++) {for (int j = 0; j < list.size() - i - 1; j++) {if (list.get(j).getF() > list.get(j + 1).getF()) {Node temp = list.get(j);list.set(j, list.get(j + 1));list.set(j + 1, temp);}}}}/*** 判断是否已存储*/public boolean judge(Node node) {boolean flag = false;for (int i = 0; i < openList.size(); i++) {if (Arrays.equals(openList.get(i).getStatus(), node.getStatus())) {flag = true;}}for (int i = 0; i < closeList.size(); i++) {if (closeList != null) {if (Arrays.equals(closeList.get(i).getStatus(), node.getStatus())) {flag = true;}}}return flag;}/*** g(n)相同时,将f(n)较大值从open表中删除*/public void delete() {for (int i = 0, j = openList.size() - 1; i < j; i++, j--) {if (openList.get(i).getG() == openList.get(j).getG()) {changeList.add(openList.get(i));changeList.add(openList.get(j));}}if (changeList.size() > 1) {bubbleSort(changeList);//由小到大排序 如果最小的有两个,则把其他的删了if (changeList.get(0).getF() == changeList.get(1).getF()) {for (int i = 2; i < changeList.size(); i++) {openList.remove(changeList.get(i));closeList.add(changeList.get(i));}} else {for (int i = 1; i < changeList.size(); i++) {openList.remove(changeList.get(i));closeList.add(changeList.get(i));}}for (int i = 0; i < changeList.size(); i++) {changeList.remove(i);}} else if (changeList.size() == 1) {openList.remove(changeList.get(0));closeList.remove(changeList.get(0));changeList.remove(0);}}/*** 通过数组找到该结点*/public Node previous(int[] arr) {Node node = null;for (int i = 0; i < closeList.size(); i++) {if (Arrays.equals(closeList.get(i).getStatus(), arr)) {node = closeList.get(i);//保存至路径表,方便最后按顺序输出pathList.add(node);}}return node;}
}
package SearchPath;import java.util.Arrays;
import java.util.Scanner;public class SearchPath {private NodeDao nodeDao;public SearchPath(Database database) {nodeDao = new NodeDao(database);}int[] start=new int[9];//{2, 5, 8, 3, 4, 6, 1, 7, 0};int[] target=new int[9];// {2, 8, 6, 3, 5, 0, 1, 4, 7};int g = 0;int flag = -1;/*** 将输入的数存入数组中*/public void inputStart(){Scanner scanner=new Scanner(System.in);System.out.println("请输入初始状态:");for(int i=0;i<9;i++) {start[i] = scanner.nextInt();}}public void inputTarget(){Scanner scanner=new Scanner(System.in);System.out.println("请输入目标状态:");for(int i=0;i<9;i++) {target[i] = scanner.nextInt();}}/*** 将第一个结点写入open表,并进行第一次搜索、随之判断、再搜索、再判断*/public void insertFirst() {inputStart();inputTarget();Node node = new Node();node.setStatus(start);node.setH(countH(start));node.setG(0);nodeDao.insertOpenList(node);g++;move(node);start();}/*** 根据不同的情况选择下一步进行扩展搜索的结点*/public void start() {if (nodeDao.getOpenList().size() > 1) {if (nodeDao.getOpenList().get(0).getF() != nodeDao.getOpenList().get(1).getF()) {g++;move(nodeDao.getOpenList().get(0));nextSearch();} else {g++;move(nodeDao.getOpenList().get(0));move(nodeDao.getOpenList().get(1));nextSearch();}} else {g++;move(nodeDao.getOpenList().get(0));nextSearch();}}/*** 再次搜索与判断*/public void nextSearch() {search();if (flag >= 0) {searchParent(nodeDao.getOpenList().get(flag));printLast();} else {//如果g(n)相同,则将f(n)较大的值从open表中删除,放入close表中nodeDao.delete();start();}}/*** 移动空格,产生新的结点*/public void move(Node parent) {int zero = index(parent.getStatus());if (zero != 0 && zero != 3 && zero != 6) {//如果能左移,则进行左移创造新结点int[] A = parent.getStatus().clone();A[zero] = A[zero - 1];A[zero - 1] = 0;insertNew(parent, A);}if (zero != 2 && zero != 5 && zero != 8) {//如果能右移,则进行右移创造新节点int[] B = parent.getStatus().clone();B[zero] = B[zero + 1];B[zero + 1] = 0;insertNew(parent, B);}if (zero != 0 && zero != 1 && zero != 2) {//如果能上移,则进行上移创造新节点int[] C = parent.getStatus().clone();C[zero] = C[zero - 3];C[zero - 3] = 0;insertNew(parent, C);}if (zero != 6 && zero != 7 && zero != 8) {//如果能下移,则进行下移创造新节点int[] D = parent.getStatus().clone();D[zero] = D[zero + 3];D[zero + 3] = 0;insertNew(parent, D);}//将父节点存入close表,并从open表中删除nodeDao.insertCloseList(parent);nodeDao.sort();}/*** 根据情况将新结点加入open表*/public void insertNew(Node parent, int[] arr) {Node node = new Node();node.setStatus(arr);node.setG(g);node.setH(countH(arr));node.setParent(parent.getStatus().clone());if (!nodeDao.judge(node)) {nodeDao.insertOpenList(node);}}/*** 计算h(n)*/public int countH(int[] arr) {int flag = 0;for (int i = 0; i < 9; i++) {if (arr[i] != target[i]) {flag++;}}return flag;}/*** 空格即零所在的位置*/public int index(int[] now) {int index = -1;for (int i = 0; i < 9; i++) {if (0 == now[i]) {index = i;}}return index;}/*** 循环找到父结点,存入pathList*/public void searchParent(Node targetNode) {if (targetNode.getParent() != null) {int[] result = targetNode.getParent();//通过数组找到该结点,存入pathListsearchParent(nodeDao.previous(result));}}/*** 判断openList中是否已有目标节点*/public void search() {for (int i = 0; i < nodeDao.getOpenList().size(); i++) {if (Arrays.equals(target, nodeDao.getOpenList().get(i).getStatus())) {flag = i;}}}/*** 按顺序打印路径*/public void printLast() {System.out.println("最短路径如下:");int number = 0;for (int i = nodeDao.getPathList().size() - 1; i >= 0; i--) {int count = 0;int[] result = nodeDao.getPathList().get(i).getStatus();for (int j = 0; j < 9; j++) {count++;printOrder(result, count, j);}System.out.println("------------");number++;}for (int i = 0; i < target.length; i++) {flag++;printOrder(target, flag, i);}System.out.println("------------");System.out.println("一共需要走 " + number + "步 达成目标");}/*** 打印输出*/public void printOrder(int[] arr, int tab, int index) {System.out.print(arr[index] + " ");if (tab % 3 == 0) {System.out.println(" ");}}
}

运行结果



2021.3.15修改:可输入初始状态和目标状态数组。

隐式图的搜索问题(九宫重排)——项目实现相关推荐

  1. 隐式图的搜索问题(九宫重排)——实验准备

    隐式图的搜索问题(九宫重排)--实验准备 隐式图的搜索问题(九宫重排) 实验任务 实验要求 A*算法 隐式图的搜索问题(九宫重排) 实验任务 对九宫重排问题,建立图的启发式搜索求解方法. 用A*算法求 ...

  2. 《数据结构课程实践》_02_隐式图的搜索问题_准备工作

    02_隐式图的搜索问题_准备工作 一.实验题目与要求 二.编程语言以及开发环境 三.实验思路 A*算法 四.预习小结 一.实验题目与要求 实验要求: 对九宫重排问题,建立图的启发式搜索求解方法: 用A ...

  3. 《数据结构课程实践》_02_隐式图的搜索问题_实现

    02_隐式图的搜索问题_实现 一.实验题目 二.编程语言以及开发环境 三.源代码 1.main类 2.节点类 3.算法类 四.运行结果 五.实验小结 一.实验题目 实验要求: 对九宫重排问题,建立图的 ...

  4. 2.隐式图的搜索问题

    题目2:隐式图的搜索问题 实验内容 对九宫重排问题,建立图的启发式搜索求解方法: 用A*算法求解九宫重排问题. 实验要求 3х3九宫棋盘,放置数码为1~8的8个棋子,棋盘中留有一个空格,空格周围的棋子 ...

  5. 题目2:隐式图的搜索问题(实验准备)

    题目2:隐式图的搜索问题(实验准备) 实验内容 实验要求 编程语言的选择 项目思路 项目解析 算法选择 A*算法 实验内容 对九宫重排问题,建立图的启发式搜索求解方法: 用A*算法求解九宫重排问题. ...

  6. 题目2:隐式图的搜索问题(A*算法解决八数码)

    数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...

  7. 实践项目—隐式图的搜索(预习报告)

    文章目录 实验内容 实验要求 编程语言及开发环境 实验思路 一.A*算法 二.A*算法解决九宫格问题 实验内容 1.对九宫重排问题,建立图的启发式搜索求解方法. 2.用A*算法求救九宫重排问题. 实验 ...

  8. 题目2:隐式图的搜索问题(A*算法解决八数码)代码实现

    从起点 开始,把它加入到一个由方格组成的open list(开放列表) 中,这个open list像是一个购物清单.Open list里的格子是可能会是沿途经过的,也有可能不经过.因此可以将其看成一个 ...

  9. 无人值守的 Windows 安装程序隐式应答文件搜索顺序

    无人值守的 Windows 安装程序 Windows 安装程序使用无人参与的安装应答文件来自动化 Windows 的在线安装和自定义.此方法对于大规模部署以及在每台计算机的配置中实现一致性和精确性非常 ...

最新文章

  1. JDK9为何要将String的底层实现由char[]改成了byte[]?
  2. linux下的软硬资源限制,关于ulimit命令修改软硬资源大小说明及正确修改软硬资源限制数配置...
  3. struts2中用户登陆验证的常用方法
  4. Netflix 的上线工具 Spinnaker
  5. 偏微分方程I PDE的例子1 一维波动与热传导方程
  6. oracle第一次使用语句创建作业失败记
  7. vt linux tty中文,Linux输入子系统和tty关系影述
  8. 微信小程序服务器登入dome,小程序登录Demo
  9. Firebug方便分解网页的小工具
  10. 人工智能应用在会计工作中的优势
  11. VMware安装Linux系统
  12. __declspec(dllimport)和__declspec(dllexport)的区别,以及有关c/c++调用约定
  13. cad计算机功能键,【答疑】Auto CAD2014计算器快捷键是什么呢?? - 视频教程线上学...
  14. 联想y7000p不识别耳机,联想y7000插上耳机没有声音
  15. NetBeans简介和简单使用
  16. Alfred神器使用手册
  17. helm和operator
  18. Xcelsius数据源概述
  19. 创蓝253云通讯短信平台变量说明
  20. ug10.0许可证服务器失败,ug10.0许可错误

热门文章

  1. 关于google是如何搜索的论文
  2. MySQL 09 DQL → select 初识查询数据和别名的使用
  3. 科视Christie 举行中国分销商授证仪式
  4. Hyperledger(超级账本)
  5.  电子工程师的出路在哪里?干了两年电子工程师(硬件开发),不知道以后方向在哪里,挺迷茫!
  6. 二维我的世界Dev c++代码
  7. C练题笔记之:Leetcode-137. 只出现一次的数字 II
  8. Spring启动自动执行方法
  9. 【selenium3+JAVA】界面自动化测试教程(一)——浏览器启动之firefox浏览器的启动
  10. Walfisch-Ikegami模型 建筑物的高度、建筑物间的距离、街道宽度对传输损耗的影响