微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

国际象棋骑士-最短路径

如何解决国际象棋骑士-最短路径

我正在尝试解决此问题: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 举报,一经查实,本站将立刻删除。