Interview Question - find minimum path between walls and ways

有墙找路的变形 1 是路 0 是墙, 让你从左边col的任意点走到右边col的任意点的最小step。走不到就返回-1注意起始点是任意左col的点 而不是左上 , 也不是走到右下。 要考虑到中间如果有一个col全部都是0(墙)的case

http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=198749&highlight=snapchat

My code:

private int row = 0;
    private int col = 0;
    private int[][] dir = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    public int shortedPath(char[][] board) {
        if (board == null || board.length == 0 || board[0].length == 0) {
            return 0;
        }
        this.row = board.length;
        this.col = board[0].length;
        Queue q = new LinkedList();
        boolean[][] mark = new boolean[row][col];
        for (int i = 0; i < row; i++) {
            if (board[i][0] == '1') {
                q.offer(new Position(i, 0, 0));
                mark[i][0] = true;
            }
        }
        
        while (!q.isEmpty()) {
            Position p = q.poll();
            if (p.y == col - 1) {
                return p.step;
            }
            for (int k = 0; k < 4; k++) {
                int next_x = p.x + dir[k][0];
                int next_y = p.y + dir[k][1];
                if (check(next_x, next_y) && !mark[next_x][next_y] && board[next_x][next_y] == '1') {
                    q.offer(new Position(p.x, p.y, p.x + 1));
                }
            }
        }
        
        return -1;
    }
    
    private boolean check(int i, int j) {
        if (i < 0 || i >= row || j < 0 || j >= col) {
            return false;
        }
        else {
            return true;
        }
    }


class Position {
    int x;
    int y;
    int step;
    Position(int x, int y, int step) {
        this.x = x;
        this.y = y;
        this.step = step;
    }
}

还是 BFS, multi- end BFS

Anyway, Good luck, Richardo! -- 09/27/2016

你可能感兴趣的:(Interview Question - find minimum path between walls and ways)