我一直在解决一项任务,该任务要求我计算从 A 点到 B 点所需的最小步数,在一个 *m 棋盘上使用不同的棋子,棋盘上也有障碍物,并输出所走的路径。
我在看 A* 算法,但它需要我得到一个很好的启发式估计,我不知道如何得到一个像骑士这样的棋子
我一直在尝试做的是首先使用广度优先搜索来找到从 A 点无障碍到达 B 点所需的最少步数,然后使用 A* 算法
public void AllPaths(int[,] chessBoard, int startX, int startY, int dimension) {
// All the moves a knight can make
int[] movementX = new int[8]{-2, -2, -1, -1, 1, 1, 2, 2};
int[] movementY = new int[8]{-1, 1, -2, 2, -2, 2, -1, 1};
chessBoard[startX, startY] = 0;
for (int step = 0; step < dimension-1; step++) {
for (int x = 0; x < dimension; x++) {
for (int j = 0; j < dimension; j++) {
if (chessBoard[x, j] == step) {
for (int k = 0; k < 8; k++) {
if (movementY[k] + x>= 0 && movementY[k] + x < dimension && movementX[k] + j >= 0 && movementX[k]+j < dimension) {
if (chessBoard[movementY[k]+x,movementX[k]+j] == -1) {
chessBoard[movementY[k]+x,movementX[k]+j] = step + 1;
}
}
}
}
}
}
}
}
骑士移动的输入和输出如下:
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
- starting from the top left
0 3 2 3 2 3 4 5
3 4 1 2 3 4 3 4
2 1 4 3 2 3 4 5
3 2 3 2 3 4 3 4
2 3 2 3 4 3 4 5
3 4 3 4 3 4 5 4
4 3 4 3 4 5 4 5
5 4 5 4 5 4 5 6
这适用于 n*n 板,但我也需要它适用于 n*m 板。我是朝着正确的方向前进还是应该完全使用其他东西?我必须改变什么才能让它适用于 n*m 板?感谢您对解决我遇到的问题提出的任何建议。