我一直在解決一個任務,需要我計算從一個點到另一個棋子在B點上所需的最小步數有障礙,並輸出所採取的路徑。獲得n * 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電路板工作嗎? 感謝您提出任何關於解決我遇到的問題的建議。
你可能有更多的運氣這個問題上的http://math.stackexchange.com – magritte
您在編碼算法時遇到問題,或者您在建立算法時遇到問題?我沒有計算,但蠻力的方法需要太多時間? –
我得到了解決我眼前的問題的答案,但我擔心如果我做正確的事情。用DFS找到啓發式然後使用A *還是我做很多毫無意義的工作是合理的? – JoonasL