题意理解
求解8puzzle游戏, 使用A*算法。
问题分析
这个用到了优先级队列,堆排序。但是作业太难了。把A*算法融进来,把树结构融进来。树结构的存储模式是双亲表示法。优先级队列就看起来太简单了。得分97分。
其他
参考https://www.cnblogs.com/evasean/p/7281901.html
链接
/* *****************************************************************************
* Name:
* Date:
* Description:
**************************************************************************** */
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.StdOut;
public class Board {
private int[][] boardValue;
private final int dim;
// create a board from an n-by-n array of tiles,
// where tiles[row][col] = tile at (row, col)
public Board(int[][] tiles) {
dim = tiles.length;
boardValue = new int[dim][dim];
for (int i = 0; i < dim; i++) {
for (int j = 0; j < dim; j++) {
boardValue[i][j] = tiles[i][j];
}
}
}
// string representation of this board
public String toString() {
StringBuilder s = new StringBuilder();
s.append(dim + "\n");
for (int i = 0; i < dim; i++) {
for (int j = 0; j < dim; j++) {
s.append(String.format("%2d ", boardValue[i][j]));
}
s.append("\n");
}
return s.toString();
}
// board dimension n
public int dimension() {
return dim;
}
// number of tiles out of place
public int hamming() {
int dis = 0;
for (int i = 0; i < dim; i++) {
for (int j = 0; j < dim; j++) {
if (boardValue[i][j] != 0 && boardValue[i][j] != i * dim + j + 1) {
dis ++;
}
}
}
return dis;
}
// sum of Manhattan distances between tiles and goal
public int manhattan() {
int dis = 0;
for (int i = 0; i < dim; i++) {
for (int j = 0; j < dim; j++) {
if (boardValue[i][j] != 0) {
int value = boardValue[i][j