如何解决国际象棋骑士-最短路径
我正在尝试解决此问题:https://www.interviewbit.com/problems/knight-on-chess-board/#
基本上,您会得到一个木板,一个起点和一个终点,并且必须找到最短的路径。我正在尝试使用骑士可以进行的8种动作在板上进行BFS,并返回所采取的动作数;如果没有解决方案,则返回-1。我遇到了内存不足的运行时错误。我不确定错误(或潜在错误)的发生位置。
编辑:以前我遇到错误,因为我忘记将节点标记为已访问。我已经添加了,但是我仍然没有得到正确的答案。
public class Solution {
private class Node {
int row;
int col;
int count;
public Node() {
this.row = 0;
this.col = 0;
this.count = 0;
}
public Node(int row,int col,int count) {
this.row = row;
this.col = col;
this.count = count;
}
}
public int knight(int A,int B,int sr,int sc,int er,int ec) {
int[][] matrix = new int[A][B];
Queue<Node> q = new LinkedList<>(); //linkedlist??
Node n = new Node(sr,sc,0);
q.add(n);
matrix[sr][sc] = -1;
final int[][] SHIFTS = {
{-2,1},{-2,-1},{2,{-1,2},-2},{1,-2}
};
int count = 0;
while(!q.isEmpty()) {
Node cur = q.remove();
if(cur.row == er && cur.col == ec) {
return cur.count;
}
for(int[] i : SHIFTS) {
if(canTraverse(matrix,cur.row + i[0],cur.col + i[1])) {
matrix[cur.row + i[0]][cur.col + i[1]] = -1;
q.add(new Node(cur.row + i[0],cur.col + i[1],cur.count + 1));
}
}
}
return -1;
}
public static boolean canTraverse(int[][] matrix,int sc) {
if(sr < 0 || sr >= matrix.length || sc < 0 || sc >= matrix[sr].length || matrix[sr][sc] == -1) {
return false;
}
return true;
}
}
解决方法
BFS 算法需要标记每个访问的位置(节点)才能正常工作。否则,此类代码可能(几乎可以肯定)导致运行时错误或超出内存限制(简而言之:A调用B,B调用A)。
解决方案::创建一个布尔数组并在节点进入队列并完成操作时标记节点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。