1 packagealgorithm;2

3 importjava.util.Comparator;4 importjava.util.PriorityQueue;5

6 /**

7 * 重排九宫,或者称之为八码数问题,或是说数字推盘问题4,使用分支界定法实现8 */

9 public classEightPuzzle {10 //方阵边长

11 private static final int N = 3;12

13 //坐标的行列索引向下、左、上、右

14 private static final int[] row = {1, 0, -1, 0};15 private static final int[] col = {0, -1, 0, 1};16

17 /**

18 * 节点19 */

20 private classNode {21 privateNode parent;22 private int[][] mat;23 private intx, y;24 private intcost;25 private intlevel;26 privateNode() {27 mat = new int[N][N];28 }29 }30

31 /**

32 * 用于堆排序的比较对象33 */

34 class Comp implements Comparator{35 @Override36 public intcompare(Node o1, Node o2) {37 return (o1.cost + o1.level) - (o2.cost +o2.level);38 }39 }40

41 /**

42 * 打印矩阵43 *44 *@parammat45 */

46 private void printMatrix(int[][] mat) {47 for (int i = 0; i < N; i++) {48 for (int j = 0; j < N; j++)49 System.out.print(mat[i][j] + " ");50 System.out.println();51 }52 }53

54 /**

55 * 交换二维矩阵中的值56 *57 *@parammat58 *@paramx59 *@paramy60 *@paramnewX61 *@paramnewY62 */

63 private void swap(int[][] mat, int x, int y, int newX, intnewY) {64 int tmp =mat[x][y];65 mat[x][y] =mat[newX][newY];66 mat[newX][newY] =tmp;67 }68

69 /**

70 * 矩阵复制71 *72 *@paramarr173 *@paramarr274 */

75 private static void copyMatrix(int[][] arr1, int[][] arr2) {76 for (int i = 0; i < arr1.length; i++)77 System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[0].length);78

79 }80

81 /**

82 * 分配一个新节点83 *84 *@parammat85 *@paramx86 *@paramy87 *@paramnewX88 *@paramnewY89 *@paramlevel90 *@paramparent91 *@return

92 */

93 private Node newNode(int[][] mat, int x, int y, int newX, int newY, intlevel, Node parent) {94 Node node = newNode();95 node.parent =parent;96

97 copyMatrix(mat, node.mat);98

99 swap(node.mat, x, y, newX, newY);100

101 node.cost =Integer.MAX_VALUE;102 node.level =level;103

104 node.x =newX;105 node.y =newY;106

107 returnnode;108 }109

110 /**

111 * 计算错位方块的数量, 即不在目标位置的非空白块的数量112 *113 *@paraminitial114 *@paramfinals115 *@return

116 */

117 private int calculateCost(int[][] initial, int[][] finals) {118 int count = 0;119 for (int i = 0; i < N; i++)120 for (int j = 0; j < N; j++)121 if (initial[i][j] != 0 && initial[i][j] !=finals[i][j]) {122 count++;123 }124 returncount;125 }126

127 /**

128 * 检查(x,y)是否为有效矩阵坐标129 *130 *@paramx131 *@paramy132 *@return

133 */

134 private boolean isSafe(int x, inty) {135 return (x >= 0 && x < N && y >= 0 && y

138 /**

139 * 打印路径140 *141 *@paramroot142 */

143 private voidprintPath(Node root) {144 if (root == null)145 return;146 printPath(root.parent);147 printMatrix(root.mat);148 System.out.println();149 }150

151 /**

152 * 分支界定法解决问题153 *154 *@paraminitial155 *@paramx156 *@paramy157 *@paramfinals158 */

159 private void solve(int[][] initial, int x, int y, int[][] finals) {160 //创建优先级队列以存储搜索树的活动节点

161 PriorityQueue pq = new PriorityQueue<>(newComp());162

163 //创建一个根节点并计算其成本

164 Node root = newNode(initial, x, y, x, y, 0, null);165 root.cost =calculateCost(initial, finals);166

167 //将根添加到活动节点列表中;

168 pq.add(root);169

170 //查找成本最低的活动节点,171 //将其子级添加到活动节点列表中,并最后将其从列表中删除。

172 while (!pq.isEmpty()) {173 //查找估计成本最低的活动节点, 找到的节点将从活动节点列表中删除

174 Node min =pq.poll();175

176 //如果min是一个答案节点

177 if (min.cost == 0) {178 printPath(min);179 return;180 }181

182 //为每个min节点的孩子183 //一个节点最多4个孩子

184 for (int i = 0; i < 4; i++) {185 if (isSafe(min.x + row[i], min.y +col[i])) {186 //创建一个子节点并计算它的成本

187 Node child =newNode(min.mat, min.x, min.y,188 min.x + row[i], min.y +col[i],189 min.level, min);190 child.cost =calculateCost(child.mat, finals);191

192 //将min的孩子添加到活动节点列表

193 pq.add(child);194 }195 }196 }197 }198

199 public static voidmain(String[] args) {200 int[][] initial =

201 {202 {1, 2, 3},203 {5, 6, 0},204 {7, 8, 4}205 };206

207 int[][] finals =

208 {209 {1, 2, 3},210 {5, 8, 6},211 {0, 7, 4}212 };213

214 //0的位置(空白块)

215 int x = 1, y = 2;216

217 EightPuzzle eightPuzzle = newEightPuzzle();218 eightPuzzle.solve(initial, x, y, finals);219

220 }221 }

python 九宫重排_算法:数字推盘游戏--重排九宫(8-puzzle)相关推荐

  1. Python实现数字推盘游戏重排九宫8-puzzle

    Python实现数字推盘游戏重排九宫8-puzzle 数字推盘游戏是一种经典的智力拼图游戏,玩家需要移动数字块,将它们按照正确的顺序排列.而8-puzzle就是数字推盘游戏中最经典的版本之一.本文将介 ...

  2. python:实现数字推盘游戏重排九宫8-puzzle(附完整源码)

    python:实现数字推盘游戏重排九宫8-puzzle from collections import deque from copy import deepcopy from queue impor ...

  3. python数字推盘游戏怎么显示步数_Python游戏开发:《最强大脑》同款游戏【数字华容道】...

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...

  4. python数字推盘游戏怎么显示步数_Python游戏开发:数字华容道

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...

  5. 数字推盘游戏java_最强大脑数字推盘游戏-最强大脑数字推盘游戏官方版 v1.0预约_手机乐园...

    游戏简介 最强大脑数字推盘游戏是一款根据同名综艺节目的挑战项目改变制作的益智闯关游戏.游戏中玩家你要走的就是将各个数字合理的进行移动与组合,而且是要在规则的限制下进行移动,这样一来你就能组出对应的数字 ...

  6. 数字推盘游戏java_数字推盘游戏下载_数字推盘最强大脑app游戏下载最新版 v1.0-安族游戏网...

    数字推盘游戏是一款让千万玩家们都为之沉迷的华容道数字解谜闯关类小游戏.在这个让人感受到真实互动的挑战模式之中,玩家们可以发挥自己的无限想象能力.空间推理能力以及你的聪明脑力开始你的数字挑战赛.简约清新 ...

  7. Python—数字推盘游戏设计

    目标: 了解pygame模块的框架与基础函数: 熟悉MVC设计模式: 掌握自顶向下的程序设计方式. 内容: 完成数字推盘游戏设计 步骤: 代码如下: import pygame import time ...

  8. 【C++ 程序】 数字推盘游戏(15-puzzle)

    这个游戏我认为是很考验思维含量的,毕竟登上了最强大脑的舞台. 然而写这个程序也累(主要有一个大bug没找出来,详见后面的分析). EasyX 图形界面版:[C++ 程序] 数字推盘游戏(15-puzz ...

  9. 【C++ 程序】 数字推盘游戏(15-puzzle)(EasyX图形界面)

    也是比较简单的程序,基于我的博客 [C++ 程序] 数字推盘游戏(15-puzzle)的逻辑,运用我的博客 [C++ 程序] 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)的 ...

最新文章

  1. Hibernate框架的配置
  2. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别
  3. Silverlight Dispatcher 类
  4. php 交换函数,php用于反转/交换数组中的键名和对应关联的键值的函数array_flip()...
  5. 实现机器学习的循序渐进指南系列汇总
  6. 搜索的php mysql代码生成器_PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)...
  7. 浙江省计算机二级办公软件高级应用技术,浙江省计算机二级办公软件高级应用技术考试大纲.doc...
  8. 信号与系统——四对时域频域对应关系
  9. 云计算就业前景怎么样 学后可以胜任哪些岗位
  10. 方差,标准差,协方差,样本标准差,总体标准差,抽样平均误差
  11. 高德地图驾车导航使用
  12. 文件上传(WebUploader)成功之前自定义裁剪(vue-img-cutter),上传裁剪的图片,并兼容ie
  13. 北京化工大学本科毕业论文答辩和论文选题PPT模板
  14. MATLAB数据转化num,str,cell,char
  15. 代价函数、目标函数、损失函数
  16. 【转】MATLAB的数组期望和方差
  17. 文华财经期货量化短线策略支撑压力指标公式,短线行情无未来函数多空均线红涨绿跌信号
  18. LeetCode中等题之分数加减运算
  19. 【问题篇】免费下载使用RDM
  20. 谷歌布莱克·勒莫因:为什么我觉得AI已觉醒了?

热门文章

  1. Dockerfile 构建 8-jre-alpine
  2. 0x79B2A261 (ucrtbased.dll) (Project4.exe 中)处有未经处理的异常: 0xC0000005: 写入位置 0x00A41023 时发生访问冲突。
  3. 【UEFI基础】Shell下的命令(一)
  4. 早期创业,应该充分利用互联网产品和服务(从”皇包车”看一家全球中文车导服务平台如何选用ToB产品)
  5. 【分享】在集简云如何查看我的应用授权是否过期?
  6. Mapreduce程序 统计文件中每个单词出现次数
  7. 系统中计算机应用上机,管理系统中计算机应用上机题1
  8. 数据结构环形队列学习(c语言)
  9. 腾讯arttemplate模板官方介绍
  10. Jenkins 错误java.lang.NoClassDefFoundError: hudson.model.Computer